我目前从语言参考中对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
一切都很好。。。直到
我尝试了几个实验
python - python和regex模块如何处理反斜杠-LMLPHP
python - python和regex模块如何处理反斜杠-LMLPHP
python - python和regex模块如何处理反斜杠-LMLPHP
问题摘要
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/

10-11 09:16
查看更多