Python 对正则表达式中的反斜杠感到困惑吗
我对正则表达式中的反斜杠感到困惑。在正则表达式中,Python 对正则表达式中的反斜杠感到困惑吗,python,regex,Python,Regex,我对正则表达式中的反斜杠感到困惑。在正则表达式中,\具有特殊含义,例如,\d表示十进制数字。如果在反斜杠前面加一个反斜杠,这个特殊的意思就会消失。在这本书中,你可以读到: 也许最重要的元字符是反斜杠,\。与Python字符串文字一样,反斜杠后面可以跟有各种字符,以表示各种特殊序列。它还用于转义所有元字符,以便您仍然可以在模式中匹配它们;例如,如果需要匹配一个[或\,则可以在它们前面加一个反斜杠以删除它们的特殊含义:\[或\ 所以print(重新搜索('\d','\d'))给出None,因为\d匹
\
具有特殊含义,例如,\d
表示十进制数字。如果在反斜杠前面加一个反斜杠,这个特殊的意思就会消失。在这本书中,你可以读到:
也许最重要的元字符是反斜杠,\
。与Python字符串文字一样,反斜杠后面可以跟有各种字符,以表示各种特殊序列。它还用于转义所有元字符,以便您仍然可以在模式中匹配它们;例如,如果需要匹配一个[
或\
,则可以在它们前面加一个反斜杠以删除它们的特殊含义:\[
或\
所以print(重新搜索('\d','\d'))
给出None
,因为\d
匹配任何十进制数字,但\d
中没有
我现在希望print(重新搜索('\\d','\d'))
匹配\d
,但答案仍然是None
只有打印(重新搜索('\\\d','\d'))
作为输出提供
有人有解释吗?Python自己的字符串解析(部分)妨碍了您 如果要查看
re
看到的内容,请键入
print '\d'
print '\\d'
print '\\\d'
在Python命令提示符上。您可以看到\d
和\\d
都会导致\d
,后者由Python字符串解析器处理
如果您想避免这些问题,请按照以下建议使用原始字符串:
r'\\d'
将导致RE模块看到\\d
。混淆是因为反斜杠字符\
在两个不同的级别被用作转义符。首先,Python解释器本身执行替换对于\
,在re
模块看到您的字符串之前。例如,\n
被转换为换行符,\t
被转换为制表符,等等。要获得实际的\
字符,您也可以对其进行转义,因此\
给出一个\
字符。如果由于\
不是可识别的转义字符,那么\
将被视为与任何其他字符一样并被传递,但我不建议依赖于此。相反,请始终通过将\
字符加倍来转义它们,即\
如果您想了解Python如何扩展字符串转义,只需打印字符串即可。例如:
s = 'a\\b\tc'
print(s)
如果s
是聚合数据类型的一部分,例如列表或元组,并且如果打印该聚合,Python会将字符串括在单引号中,并包含\
转义符(以规范形式),因此请注意字符串的打印方式。如果您只是在解释器中键入带引号的字符串,解释器也会将其显示在带引号的\
转义符中
一旦您知道字符串是如何编码的,您就可以考虑re
模块将如何处理它。例如,如果您想在传递给re
模块的字符串中转义\
,则需要将\\
传递给re
,这意味着您需要在自己的代码中使用\\\\
ted Python字符串。Python字符串将以\\
结束,re
模块将其视为单个文本\
字符
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
在Python字符串中包含
\
字符的另一种方法是使用原始字符串,例如r'a\b'
相当于调用search()时正则表达式前面的“a\\b”
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
如果“\”后跟可识别的Python转义字符(t、n等),则反斜杠和转义字符将替换为实际的Unicode或8位字符。例如,“\t”将替换为用于制表符的ASCII字符。否则,它将被传递并解释为“\”字符
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
考虑以下几点
>>> s = '\t'
>>> print ("[" + s + "]")
>>> [ ] // an actual tab character after preprocessing
>>> s = '\d'
>>> print ("[" + s + "]")
>>> [\d] // '\d' after preprocessing
有时,我们希望在字符串中包含一个包含“\”的字符序列,而不将其解释为转义序列。为此,我们用“\”转义“\”。现在,当Python看到“\”时,它将用单个“\”字符替换两个反斜杠
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
Python解释器传递两个字符串后,它们被传递到re模块的搜索方法。搜索方法解析正则表达式字符串以识别正则表达式的元字符
现在“\”也是一个特殊的正则表达式元字符,除非在执行research()方法时转义它,否则它将被解释为一个
考虑下面的调用
>>> match = re.search('a\\t','a\\t') //Match is None
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
这里,match是None。为什么?让我们在Python解释器通过后看看字符串
String 1: 'a\t'
String 2: 'a\t'
那么为什么match等于None呢解释字符串1,因为它是正则表达式,所以反斜杠被解释为元字符,而不是普通字符。但是,字符串2中的反斜杠不在正则表达式中,并且已经由Python解释器处理,因此它被解释为普通字符
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
因此search()方法在字符串“a\t”中查找“a escape-t”,其中