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

时间:2011-07-16 12:45:42

标签: 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'''

Thx in advanced!

5 个答案:

答案 0 :(得分:6)

你是怎么做的

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

如果这些是您文件的内容(如图所示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ècederésistance:之前的确是jwz意味着 1 的一个很好的证明。如果你忘记了正则表达式(并且知道原始字符串),解决方案变得更加明显:

>>> print s1.replace(r'\"', 'thevalue').replace(r"\'", 'thevalue')
some 'long' string thevalue and thevalue some 'escaped' strings

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

答案 1 :(得分:1)

这就是你想要的吗?

import re
Long_string = "some long string \' and \" some escaped strings"
value_to_change = re.compile( "'|\"" )
modified = re.sub(value_to_change , 'thevalue' , Long_string )
print modified 

答案 2 :(得分:1)

问题在于你的字符串\'和\“转换为'和',所以你的例子就是如此,你将无法只匹配\'而不匹配周围的单引号长

但我的理解是这个数据来自一个文件,所以假设你有your_file.txt包含

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

您可以使用以下代码替换\'和\“:

import re

from_file = open("your_file.txt", "r").read()

print(re.sub("\\\\(\"|')", "thevalue", from_file))

注意四个斜杠。因为这是一个字符串\被转换为\(因为这是一个转义字符)。然后在正则表达式中,剩余的\再次转换为\,因为这也是常规的experssion转义字符。结果将匹配单个斜杠和“和”引号之一。

答案 3 :(得分:0)

请记住,所有这些字符串完全相同:

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

其中任何一个都没有反斜杠字符。所以你正在寻找的正则表达式不需要匹配反斜杠和引号,只是引用:

modified = re.sub("['\"]", 'thevalue', Long_string)

顺便说一下:在使用它之前你也不必编译正则表达式,re.sub将接受一个字符串正则表达式以及一个已编译的正则表达式。

答案 4 :(得分:0)

我尝试使用此方法打印单个反斜杠(Python 3):

single_backslash_str = r'\ '[0]
print('single_backslash_str')         #output: \
print('repr(single_backslash_str)')   #output: '\\'

希望这会有所帮助!

相关问题