如何在Python中逃避反斜杠和单引号或双引号?

Flo*_*rin 3 python

如何在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'''
Run Code Online (Sandbox Code Playgroud)

先进的!

小智 8

你是怎么做到的

如果从文件中读取"长字符串"(正如您在评论中提到的那样),那么您的问题就会产生误导.既然你显然不完全理解逃逸是如何起作用的,那么你写下来的问题可能与你真正的问题有所不同.

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

some 'long' string \' and \" some 'escaped' strings
Run Code Online (Sandbox Code Playgroud)

那么这就是它在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
Run Code Online (Sandbox Code Playgroud)

你在问题中写的内容会产生:

>>> 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
Run Code Online (Sandbox Code Playgroud)

你看得到差别吗?

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
Run Code Online (Sandbox Code Playgroud)

你是怎么想的

以上只是为了告诉你,你的问题令人困惑.

实际答案有点难度 - 当您使用正则表达式时,反斜杠会带来另一层特殊含义.如果你想通过字符串转义安全地获得反斜杠并通过正则表达式转义到实际的正则表达式,你必须相应地写下多个反斜杠.

此外,将单引号(')放在单引号原始字符串(r'')中的规则也有点棘手,因此我将使用带有三个单引号(r'''''')的原始字符串.

>>> print re.sub(r'''\\['"]''', 'thevalue', s1)
some 'long' string thevalue and thevalue some 'escaped' strings
Run Code Online (Sandbox Code Playgroud)

两个反斜杠在整个字符串转义期间保留两个反斜杠,然后通过正则表达式转义只变为一个反斜杠而没有特殊含义.总的来说,正则表达式说:"匹配一个反斜杠,然后是单引号或双引号."

应该怎么做

现在对于piècederésistance:前面的内容真的很好地证明了jwz的意思1.如果你忘记了正则表达式(并了解原始字符串),解决方案变得更加明显:

>>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
some 'long' string thevalue and thevalue some 'escaped' strings
Run Code Online (Sandbox Code Playgroud)

1有些人在遇到问题时会想"我知道,我会使用正则表达式".现在他们有两个问题.