python和正则表达式模块如何处理反斜杠

时间:2016-03-04 13:35:03

标签: python regex python-3.4

我目前对语言参考中的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

的实验

enter image description here

enter image description here

enter image description here

问题摘要

1)请确认/修改我目前对正则表达式引擎的理解

2)为什么这些假定的非教科书定义模式匹配

3)来自\\\r的{​​{1}}到底是怎么回事,整个“我们有相同的字符串长度,但是我们比较了不相等,但我们在匹配a时都做了同样的工作在之前的re.escape测试中回车“

1 个答案:

答案 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'\\''\\\\'中)