你是如何做到的
如果你的“长字符串”是从文件中读取的(正如你在评论中提到的),那么你的问题是误导性的。由于你显然不完全理解转义的工作原理,所以你写下的问题可能与你真正想问的问题不同。
如果这些是你文件的内容(如图所示的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
在字符串转义过程中,两个反斜杠保持不变,然后通过正则表达式转义变成只有一个无特殊含义的反斜杠。因此,这个正则表达式的意思是:"匹配一个反斜杠后跟着单引号或双引号"。
正确的做法
现在,让我们来看看jwz所说的好例子1:如果你忘记正则表达式(但了解原始字符串),解决方案就变得更加明显:
>>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
some 'long' string thevalue and thevalue some 'escaped' strings
1有些人遇到问题时,会想:“我知道了,我将使用正则表达式。”现在他们有两个问题。