re.DEBUG标志的含义是什么?



re.DEBUG标志提供了Python中正则表达式模式内部工作的一瞥,例如:

import re
re.compile(r"(a(?:b)){1,3}(c)", re.DEBUG)

的回报:

MAX_REPEAT 1 3
SUBPATTERN 1 0 0
LITERAL 97
LITERAL 98
SUBPATTERN 2 0 0
LITERAL 99
0. INFO 4 0b0 3 7 (to 5)
5: REPEAT 11 1 3 (to 17)
9.   MARK 0
11.   LITERAL 0x61 ('a')
13.   LITERAL 0x62 ('b')
15.   MARK 1
17: MAX_UNTIL
18. MARK 2
20. LITERAL 0x63 ('c')
22. MARK 3
24. SUCCESS

我在哪里可以找到操作码(SUBPATTERN, MAX_REPEAT等)的含义?其中一些是不言自明的,但整个目的是不清楚的。SUBPATTERN 1 0 0中的1 0 0是什么意思

一些我尝试过的事情:

  • 阅读re.DEBUG的文档
  • 读取解析器的源代码。
  • 谷歌搜索

注意:我知道这可能不是一个完美的StackOverflow问题,但我已经用MRE写了一个明确的问题,并努力解决手头的问题。此外,我认为解决这个问题对其他用户也有好处。

我想我可以回答你的大部分问题,但可能不是全部。因此,OPCODES是pythonre模块内部的一部分,似乎并不意味着面向用户。

,

MAX_REPEAT 1 3表示模式重复1到3次。

LITERAL只是一个字符字面量(例如'a'的ascii值是97)。

SUBPATTERN 1 0 0匹配第一个子模式(例如group),SUBPATTERN 2 0 0匹配第二个子模式,等等。据我所知,这里的0只是未使用的占位符,但这是我不是100%清楚的一部分。

无论如何,如果你真的想调试一些正则表达式,我建议你使用许多不错的在线正则表达式调试器(例如https://regex101.com/)。

看起来很多逻辑都在C模块中,我对语言不太熟悉,所以这只是基本的发现,但它似乎更具体到调试输出的第二部分(具有行号的位)。

这里是我发现的一些注释解释输出的地方。

重复/MAX_UNTIL MIN_UNTIL:

<REPEAT> <skip> <1=min> <2=max> item <UNTIL/MIN_UNTIL/MAX_UNTIL> tail

:优化信息块。如果SRE_INFO_PREFIXSRE_INFO_CHARSET在标志中,则后面跟着更多。

<INFO> <1=skip> <2=flags> <3=min> <4=max> <5=prefix info>

文字:匹配字面值字符串。这是用于短前缀,如果快速搜索被禁用。

<LITERAL> <code>

马克:设置一个标记,可能用于回溯。

<MARK> <gid>

所有可用的操作码,如果有人想尝试挖掘更多:

SRE_OP_FAILURE
SRE_OP_SUCCESS
SRE_OP_ANY
SRE_OP_ANY_ALL
SRE_OP_ASSERT
SRE_OP_ASSERT_NOT
SRE_OP_AT
SRE_OP_BRANCH
SRE_OP_CALL
SRE_OP_CATEGORY
SRE_OP_CHARSET
SRE_OP_BIGCHARSET
SRE_OP_GROUPREF
SRE_OP_GROUPREF_EXISTS
SRE_OP_GROUPREF_IGNORE
SRE_OP_IN
SRE_OP_IN_IGNORE
SRE_OP_INFO
SRE_OP_JUMP
SRE_OP_LITERAL
SRE_OP_LITERAL_IGNORE
SRE_OP_MARK
SRE_OP_MAX_UNTIL
SRE_OP_MIN_UNTIL
SRE_OP_NOT_LITERAL
SRE_OP_NOT_LITERAL_IGNORE
SRE_OP_NEGATE
SRE_OP_RANGE
SRE_OP_REPEAT
SRE_OP_REPEAT_ONE
SRE_OP_SUBPATTERN
SRE_OP_MIN_REPEAT_ONE

最新更新