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

Python 用带反斜杠的字符串替换字符串,python,string,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\\$" 有

我正在创建一个程序,自动生成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\\$"

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

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

例如,比较

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

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

print(repr('\\'))
# '\\'
但是第二个字符串的表示仍然显示两个反斜杠。此行为与其他特殊字符(如
\n
)相同,在这些字符中更容易看到问题。正如
\n
是表示
换行的特殊字符一样,
\
是表示
单个反斜杠的特殊字符

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

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

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

更好的方法是使用另一个反斜杠显式转义,或者使用一个不允许转义的反斜杠。所有这些都将给出相同的结果

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\$
您可以尝试re.sub。它将给出预期的结果

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\$
print re.sub(r"\$","\$",x)