3 回答
TA贡献2039条经验 获得超7个赞
混淆是因为反斜杠字符\
在两个不同的级别用作转义。首先,Python解释器本身\
在re
模块看到你的字符串之前执行替换。例如,\n
转换为换行符,\t
转换为制表符等。要获得实际\
角色,您也可以将其转义,因此只\\
需要一个\
字符。如果后面的字符\
不是可识别的转义字符,那么它将\
被视为任何其他字符并通过,但我不建议依赖于此。相反,总是\
通过加倍来逃避你的角色,即\\
。
如果你想看看Python如何扩展你的字符串转义,只需打印出字符串。例如:
s = 'a\\b\tc'print s
如果s
是聚合数据类型的一部分,例如列表或元组,并且如果打印该聚合,Python将用单引号括起该字符串并包含\
转义(以规范形式),因此请注意字符串的方式正在印刷。如果您只是在解释器中键入带引号的字符串,它也会将其显示在带有'\'转义符的引号中。
一旦你知道你的字符串是如何被编码的,你就可以考虑re
模块将用它做什么。例如,如果要\
在传递给re
模块的字符串中转义,则需要传递\\
给re
,这意味着您需要\\\\
在引用的Python字符串中使用。Python的字符串将结束与\\
和re
模块将其视为一个单一的文字\
字符。
\
在Python字符串中包含字符的另一种方法是使用原始字符串,例如r'a\b'
相当于"a\\b"
。
TA贡献1825条经验 获得超4个赞
在对search()的调用中,正则表达式之前的r字符指定正则表达式是原始字符串。这允许反斜杠在正则表达式中用作常规字符,而不是在转义字符序列中。让我解释 ...
在re模块的搜索方法处理传递给它的字符串之前,Python解释器对字符串进行初始传递。如果字符串中存在反斜杠,则Python解释器必须确定每个是否是Python转义序列的一部分(例如\ n或\ t)。
注意:此时Python并不关心'\'是否是正则表达式元字符。
如果'\'后跟一个识别的Python转义字符(t,n等),则反斜杠和转义字符将替换为实际的Unicode或8位字符。例如,'\ t'将替换为选项卡的ASCII字符。否则它被传递并解释为'\'字符。
考虑以下。
>>> s = '\t'>>> print ("[" + s + "]")>>> [ ] // an actual tab character after preprocessing>>> s = '\d'>>> print ("[" + s + "]")>>> [\d] // '\d' after preprocessing
有时我们希望在字符串中包含一个包含'\'的字符序列,而不会被Python解释为转义序列。要做到这一点,我们用'\'来逃避'\'。现在,当Python看到'\'时,它会用一个'\'字符替换两个反斜杠。
>>> s = '\\t'>>> print ("[" + s + "]")>>> [\t] // '\t' after preprocessing
在Python解释器对两个字符串进行传递后,它们将传递给re模块的搜索方法。搜索方法解析正则表达式字符串以标识正则表达式的元字符。
现在'\'也是一个特殊的正则表达式元字符,并且被解释为一个UNLESS,它在执行re search()方法时被转义。
考虑以下电话。
>>> match = re.search('a\\t','a\\t') //Match is None
这里匹配是None。为什么?让我们看看Python解释器传递后的字符串。
String 1: 'a\t'String 2: 'a\t'
那么为什么匹配等于None?当search()解释String 1时,由于它是正则表达式,因此反斜杠被解释为元字符,而不是普通字符。但是,字符串2中的反斜杠不在正则表达式中,并且已由Python解释器处理,因此它被解释为普通字符。
所以search()方法在字符串'a \ t'中寻找'a escape-t',它们不匹配。
为了解决这个问题,我们可以告诉search()方法不要将'\'解释为元字符。我们可以通过逃避它来做到这一点。
考虑以下电话。
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
再次,让我们看看Python解释器传递后的字符串。
String 1: 'a\\t'String 2: 'a\t'
现在,当search()方法处理正则表达式时,它会看到第二个反斜杠被第一个反斜杠转义,不应该被视为元字符。因此,它将字符串解释为'a \ t',它与String 2匹配。
将search()视为'\'作为字符的另一种方法是在正则表达式之前放置一个r。这告诉Python解释器不要预处理字符串。
考虑一下。
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'
这里的Python解释器不会修改第一个字符串,但会处理第二个字符串。传递给search()的字符串是:
String 1: 'a\\t'String 2: 'a\t'
与前面的示例一样,搜索将'\'解释为单个字符'\'而不是元字符,因此与字符串2匹配。
添加回答
举报