如何在Python中转义反斜杠和单引号或双引号?

例如:

Long string = '''some 'long' string \' and \" some 'escaped' strings'''
value_to_change = re.compile(A EXPRESION TO REPRESENT \' and \")
modified = re.sub(value_to_change, 'thevalue', Long_string)

## Desired Output
modified = '''some 'long' string thevalue and thevalue some 'escaped' strings'''

最佳答案

你是怎么做到的

如果您从文件中读取了“长字符串”(如您在评论中所述),那么您的问题将产生误导。由于您显然不完全了解转义的工作原理,因此您写下的问题可能与您真正遇到的问题不同。

如果这些是文件的内容(如图所示为51个字节+可能是一两个行尾字符):

some 'long' string \' and \" some 'escaped' strings

那么这就是在python中的样子:
>>> s1 = open('data.txt', 'r').read().strip()
>>> s1
'some \'long\' string \\\' and \\" some \'escaped\' strings'
>>> print s1
some 'long' string \' and \" some 'escaped' strings

您在问题中写的内容将产生:
>>> s2 = '''some 'long' string \' and \" some 'escaped' strings'''
>>> s2
'some \'long\' string \' and " some \'escaped\' strings'
>>> print s2
some 'long' string ' and " some 'escaped' strings
>>> len(s)
49

你看得到差别吗?

s2中没有反斜杠,因为当您使用它们在Python中写下字符串时,它们具有特殊的含义。从文件中读取它们时,它们没有特殊含义。

如果要写下一个在其后带有反斜杠的字符串,则必须保护输入的反斜杠。您必须避免让Python认为它具有特殊含义。您可以通过转义转义来实现-使用反斜杠。

一种方法是使用反斜杠,但通常更简单,更易混淆的方法是使用原始字符串:
>>> s3 = r'''some 'long' string \' and \" some 'escaped' strings'''
'some \'long\' string \\\' and \\" some \'escaped\' strings'
>>> print s3
some 'long' string \' and \" some 'escaped' strings
>>> s1 == s3
True

你是什​​么意思

以上只是向您显示您的问题令人困惑。

实际的答案要难一些-使用正则表达式时,反斜杠还具有另一层特殊含义。如果要通过字符串转义和通过正则表达式转义到实际的正则表达式来安全地获得反斜杠,则必须相应地记下多个反斜杠。

此外,将单引号(')放在单引号原始字符串(r'')中的规则也有些棘手,因此我将使用带有三重单引号(r'''''')的原始字符串。
>>> print re.sub(r'''\\['"]''', 'thevalue', s1)
some 'long' string thevalue and thevalue some 'escaped' strings

在字符串转义过程中,两个反斜杠保持两个反斜杠,然后通过正则表达式转义仅成为一个没有特殊含义的反斜杠。总而言之,正则表达式表示:
“匹配一个反斜杠,后跟单引号或双引号。”

应该怎么做

现在,对于piècede ressistance:前面的内容确实很好地证明了jwz的含义1。如果您忘记了正则表达式(并且了解原始字符串),则解决方案将变得更加显而易见:
>>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
some 'long' string thevalue and thevalue some 'escaped' strings

1有些人遇到问题时会认为“我知道,我会使用正则表达式”。现在他们有两个问题。

关于python - 如何在Python中转义反斜杠和单引号或双引号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6717435/

10-16 03:16