你是怎么做到的
如果你的“长字符串”是从文件中读取的(正如你在评论中提到的),那么你的问题是误导性的。因为你显然不完全理解逃逸的工作原理,所以你写下的问题可能与你真正的问题不同。
如果这些是文件的内容(如图所示为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
这两个反斜杠在字符串转义过程中保留两个反斜杠,然后通过正则表达式转义仅成为一个没有特殊含义的反斜杠。总的来说,regex说:
“匹配一个反斜杠,后跟单引号或双引号。”
应该怎么做
现在,对于pièce de résistance来说:前面的例子很好地证明了jwz的含义。如果您忘记了regex(并了解原始字符串),解决方案将变得更加明显:>>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
some 'long' string thevalue and thevalue some 'escaped' strings
1有些人遇到问题时,会想“我知道,我会使用正则表达式。”现在他们有两个问题。