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

zpqajqem  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(125)

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等)的含义?其中一些是不言自明的,但整个目的不清楚。1 0 0SUBPATTERN 1 0 0中是什么意思?
我尝试过的一些事情:

  • 阅读re.DEBUG上的文档
  • 读取解析器的source code
  • 谷歌search
    **注意:**我知道这可能不是一个完美的适合StackOverflow问题,但我已经写了一个明确的问题,一个MRE和我的努力解决手头的问题。而且,我认为解决这个问题对其他用户也有好处。
nzkunb0c

nzkunb0c1#

我想我可以回答你的大部分问题,但也许不是全部。所以OPCODES是python re模块内部的一部分,似乎并不意味着是面向用户的。
也就是说
MAX_REPEAT 1 3表示图案重复1到3次。
LITERAL只是一个字符文字(例如,'a'的ascii是97)。
SUBPATTERN 1 0 0匹配第一个子模式(例如group),SUBPATTERN 2 0 0匹配第二个子模式,等等。据我所知,这里的0只是未使用的占位符,但这是我不是100%清楚的一部分。
无论如何,如果你真的想调试一些正则表达式,我建议你使用许多很好的在线正则表达式调试器之一(例如https://regex101.com/)。

9udxz4iz

9udxz4iz2#

看起来很多逻辑都在C module中,我不太熟悉这种语言,所以这只是基本的发现,但它似乎更具体到调试输出的第二部分(行号位)。
下面是我发现的一些注解解释输出的例子。

REPEAT/MAX_UNTIL/MIN_UNTIL

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

INFO:优化信息块,如果标志中有SRE_INFO_PREFIXSRE_INFO_CHARSET,则后面有更多。

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

**LITERAL:**匹配文字字符串,用于短前缀,如果禁用快速搜索。

<LITERAL> <code>

**MARK:**设置一个标记,可能是为了回溯。

<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

相关问题