python和regex模块如何处理反斜杠
我目前从语言参考中对Python3.4正则表达式库的理解似乎与我对模块的实验结果不符python和regex模块如何处理反斜杠,python,regex,python-3.4,Python,Regex,Python 3.4,我目前从语言参考中对Python3.4正则表达式库的理解似乎与我对模块的实验结果不符 我目前的理解 正则表达式引擎可以看作是一个独立的实体,它有自己的编程语言(regex)。它恰好存在于python内部,以及各种其他语言中。因此,如果愿意,python必须将(regex)模式/代码传递给这个独立的解释器 为了清楚起见,以下文本将使用逻辑长度的概念——它应该表示给定字符串的逻辑长度。例如,特殊字符回车\r将具有len=1,因为它是单个字符。但是,两个不同的字符(反斜杠后跟r)\r将具有len=2
我目前的理解 正则表达式引擎可以看作是一个独立的实体,它有自己的编程语言(regex)。它恰好存在于python内部,以及各种其他语言中。因此,如果愿意,python必须将(regex)模式/代码传递给这个独立的解释器 为了清楚起见,以下文本将使用
逻辑长度的概念
——它应该表示给定字符串的逻辑长度。例如,特殊字符回车\r
将具有len=1
,因为它是单个字符。但是,两个不同的字符(反斜杠后跟r)\r
将具有len=2
1) 假设我们希望在某些文本中匹配回车\r len=1
2) 我们需要将模式\r len=2
(2个不同的字符)提供给正则表达式引擎
3) 正则表达式引擎接收\r len=2
,并将模式解释为:匹配特殊字符回车\r len=1
4) 它继续前进,发挥着神奇的作用
问题在于,python解释器将反斜杠字符\
本身作为特殊的东西使用——一个用于转义其他内容(如引号)的字符
因此,当我们用python编码时,需要表达我们需要将模式\r len=2
发送到内部正则表达式解释器的想法,我们必须键入pattern='\\r'
或者pattern=r'\r'
来表示\r len=2
一切都很好。。。直到 我尝试了两个涉及
re.escape
问题摘要 1) 请确认/修改我目前对正则表达式引擎的理解 2) 为什么这些假定的非教科书定义模式匹配
3)
re.escape
中的\\\r
到底是怎么回事,以及整个“我们有相同的字符串长度,但我们比较不相等,但在前面的re.search
test”中匹配回车符时,我们也都是这样做的。你需要明白,每次编写模式时,它首先被解释为字符串,然后由正则表达式引擎进行第二次读取和解释。
让我们描述一下发生了什么:
>>> s='\r'
s包含字符CR
>>> re.match('\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
字符串现在是一个文本反斜杠和一个文本r,正则表达式引擎接收这两个字符,由于\r
是一个正则表达式转义序列,也意味着一个CR字符,因此您也获得了一个匹配
>>> re.match('\\\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
重新匹配('\\\r',s)
字符串包含文本反斜杠和文本CR,正则表达式引擎接收\
和CR
,但由于\CR
不是已知的正则表达式转义序列,因此将忽略反斜杠并获得匹配
请注意,对于正则表达式引擎,文本反斜杠是转义序列
\\\
(因此在模式字符串r'\\\'
或'\\\\'
中)以后请发布格式化文本,而不是屏幕截图。这使得其他人更容易复制和粘贴以在本地复制您的问题,并且使用屏幕阅读器等的人也更容易访问。当您在上一个示例中说反斜杠被忽略时\CR
,这是否意味着正则表达式引擎会无声地将\CR
转换为CR
?那么任何未知序列都会变成代码(从反斜杠中去掉)?假设\X
\Y
\Z
都是未知的,那么pat\Xte\Yrn\Z
也会悄悄地变成pattern
?@Alan:没错,测试你自己:re.match(r'\l',l')
或re.match('\\l',l')
。只有反斜杠被忽略,以下字符不被忽略:pat\Xte\Yrn\K
对于正则表达式引擎变为patxternk
。(\Z
具有特殊含义)
>>> re.match('\\\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>