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

标签 python regex parsing 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


问题总结

Point 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/42834692/

相关文章:

python - Google Cloud Platform - 最终异常 : b'[Errno 28] No space left on device') for download of

javascript - 快速解析 JSON 条目

R-从字符串右边提取第n个字符后提取信息

php - 解决这个问题的正则表达式是什么?

python - 将 Python 正则表达式转换为 VisualBasic

c - 用于从头文件中提取和操作 C 函数的搜索工具

python - celery 生产优雅重启

python - 将 RTSP 流转发到远程套接字(RTSP 代理?)

python - 从多列中过滤数据

json - 如何读取无效的 JSON 格式亚马逊 firehose