我目前从语言引用中对 python 3.4 regex 库的理解似乎与我对该模块的实验结果不符。
我目前的理解
正则表达式引擎可以被认为是一个单独的实体,具有它自己理解的编程语言 (regex)。它恰好存在于 python 以及其他各种语言中。因此,如果您愿意,python 必须将(正则表达式)模式/代码传递给这个独立的解释器。
为清楚起见,以下文本将使用逻辑长度
的概念 - 它应该表示给定字符串的逻辑长度。例如,特殊字符回车 \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) re.escape
中的 \\\r
究竟是怎么回事,整个“我们有相同的字符串长度,但我们比较的不相等,但在前面的 re.search
测试中,我们在匹配回车符方面也都采用相同的方法”
最佳答案
您需要了解,每次您编写一个模式时,它首先被解释为一个字符串,然后再由正则表达式引擎读取和解释第二次。 让我们描述一下发生了什么:
>>> s='\r'
s 包含字符 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'\\'
或 '\\\\'
)
关于python - python 和 regex 模块如何处理反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41855278/