我正在创建一个程序,在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\\$"
有没有办法避免加倍转义字符?
答案 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会给出预期的结果。