python - python 和 regex 模块如何处理反斜杠

标签 python regex python-3.4

我目前从语言引用中对 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

的实验

enter image description here

enter image description here

enter image description here


问题总结

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/

相关文章:

python - 如何在Python中逐像素分析图像

python - TensorFlow:整合神经网络的输出

python - heroku python3 : ImportError: No module named 'encodings'

python - 如何通过 python 中的键在循环中命名 pandas 数据帧?

python - 我不知道如何在 Python 中创建一个调用我的函数的字典

python - 在方法中扩展或追加字符串

python - Pandas:将函数应用于每对列

php - 是否有 RegEx 来验证 Base32::RFC 3548

php - 使用 Regex 解析 XML/XHTML 数据

用于读取类 CSV 行的 Python 正则表达式