我目前从语言参考中对Python3.4正则表达式库的理解似乎与模块的实验结果不符。
我现在的理解
正则表达式引擎可以看作是一个独立的实体,它有自己的编程语言(regex)。它恰好生活在python中,以及其他各种语言中。因此,如果愿意的话,python必须将(regex)模式/代码传递给这个独立的解释器。
为了清楚起见,下面的文本将使用logical length
-这个概念应该表示给定字符串在逻辑上的长度。例如,特殊字符回车\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
。
一切都很好。。。直到
我尝试了几个实验
问题摘要
1)请确认/修改我目前对regex引擎的理解
2)为什么这些假设的非教科书定义模式匹配
3)究竟是怎么回事,从re.escape
开始,整个“我们有相同的字符串长度,但是我们比较了不相等的字符串长度,但是在前面的\\\r
测试中,我们在匹配回车时也做了相同的工作”
最佳答案
您需要了解,每次编写模式时,它首先被解释为字符串,然后由regex引擎再次读取和解释。
让我们描述一下发生了什么:
>>> s='\r'
s包含字符CR。
>>> re.match('\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
这里的字符串
'\r'
是一个包含CR的字符串,因此给regex引擎一个文本CR。>>> re.match('\\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
字符串现在是一个文本反斜杠和一个文本r,regex引擎接收这两个字符,因为
\r
是一个regex转义序列,也意味着一个CR字符,所以您也获得了一个匹配。>>> re.match('\\\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
字符串包含文本反斜杠和文本CR,正则表达式引擎接收
\
和CR
,但由于\CR
不是已知的正则表达式转义序列,因此将忽略反斜杠并获得匹配。请注意,对于regex引擎,文本反斜杠是转义序列
\\
(因此在模式字符串r'\\'
或'\\\\'
中)关于python - python和regex模块如何处理反斜杠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42834692/