用带反斜杠的字符串替换字符串

时间:2014-09-29 15:50:23

标签: python string

我正在创建一个程序,在LaTeX中自动生成我的报告,我必须转义特殊的LaTeX字符。基本上,每当我阅读$_%等时,我都必须分别将其替换为\$\_\%

我天真地尝试mystring.replace('$','\$'),但它添加了一个双反斜杠,如下所示:

my_text_to_parse = "$x^2+2\cdot x + 2 = 0$"
my_text_to_parse.replace('$','\$')
#=> "\\$x^2+2\cdot x + 2 = 0\\$"

有没有办法避免加倍转义字符?

2 个答案:

答案 0 :(得分:2)

你会看到双反斜杠,因为你得到字符串的representation,而不是输出。在表示中,它会打印反斜杠,因为\是受保护的字符,因此必须进行转义。这是因为它用于特殊字符(例如\t\n)并且使用可能会混淆。当实际打印或保存字符串时,这些双反斜杠应该作为单个反斜杠正确打印

例如,比较

print('\')
# SyntaxError: EOL while scanning string literal

print('\\')
# \

在第一个字符串中,第二个引号由反斜杠转义。这说明了为什么你通常不能在字符串中使用原始反斜杠。在第二个字符串中,第二个反斜杠被第一个反转。两个反斜杠被解释为单个反斜杠。

print(repr('\\'))
# '\\'

但是第二个字符串的表示仍然显示两个反斜杠。此行为与\n等其他特殊字符相同,可以更容易地查看问题。正如\n是表示line break的特殊字符一样,\\是表示single backslash的特殊字符。

print('hi\nmom')
# hi
# mom

print(repr('hi\nmom'))
# 'hi\nmom'

要真正回答你的问题,你的方式应该正常工作,但你可能不希望这样做。这是因为使用'\$'创建字符串不会使此转义问题变得清晰。它似乎是一个特殊字符\$,就像\n是一个特殊字符一样,但由于没有像这样定义的字符,python解释器足够聪明,可以替换单个反斜杠双反斜杠。但是你通常不想依赖这种行为。

更好的方法是使用另一个显式转义反斜杠或使用raw string,其中不允许转义。所有这些都会产生相同的结果。

s = '$x^2+2\\cdot x + 2 = 0$'

print(s.replace('$', '\$'))   # Technically works, but not as clear
# \$x^2+2\cdot x + 2 = 0\$

print(s.replace('$', '\\$'))  # Escaping the backslash
# \$x^2+2\cdot x + 2 = 0\$

print(s.replace('$', r'\$'))  # Using a raw string
# \$x^2+2\cdot x + 2 = 0\$

答案 1 :(得分:0)

print re.sub(r"\$","\$",x)

你可以试试re.sub.It会给出预期的结果。