我目前对语言参考中的python 3.4正则表达式库的理解似乎与我的模块实验结果不符。
正则表达式引擎可以被认为是一个单独的实体,它有自己的编程语言(正则表达式)。它恰好生活在python中,在各种其他语言中。因此,如果你愿意,python必须将(正则表达式)模式/代码传递给这个独立的解释器。
为清楚起见,以下文本将使用logical length
的概念 - 它应该表示逻辑上给定字符串的长度。例如,特殊字符回车\r
将具有len=1
,因为它是单个字符。但是,2个不同的字符(反斜杠后跟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)来自\\\r
的{{1}}到底是怎么回事,整个“我们有相同的字符串长度,但是我们比较了不相等,但我们在匹配a时都做了同样的工作在之前的re.escape
测试中回车“
答案 0 :(得分:3)
您需要了解每次编写模式时,首先将其解释为字符串,然后再由正则表达式引擎进行读取和解释。 让我们描述一下会发生什么:
>>> s='\r'
包含字符CR。
>>> re.match('\r', s)
<_sre.SRE_Match object; span=(0, 1), match='\r'>
此处字符串'\r'
是一个包含CR的字符串,因此为正则表达式引擎提供了文字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'>
该字符串包含文字反斜杠和文字CR,正则表达式引擎接收\
和CR
,但由于\CR
不是已知的正则表达式转义序列,因此忽略反斜杠并且你获得了一场比赛。
请注意,对于正则表达式引擎,文字反斜杠是转义序列\\
(因此在模式字符串r'\\'
或'\\\\'
中)