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 0
在SUBPATTERN 1 0 0
中是什么意思?
我尝试过的一些事情:
- 阅读
re.DEBUG
上的文档 - 读取解析器的source code。
- 谷歌search
**注意:**我知道这可能不是一个完美的适合StackOverflow问题,但我已经写了一个明确的问题,一个MRE和我的努力解决手头的问题。而且,我认为解决这个问题对其他用户也有好处。
2条答案
按热度按时间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/)。
9udxz4iz2#
看起来很多逻辑都在C module中,我不太熟悉这种语言,所以这只是基本的发现,但它似乎更具体到调试输出的第二部分(行号位)。
下面是我发现的一些注解解释输出的例子。
REPEAT/MAX_UNTIL/MIN_UNTIL:
INFO:优化信息块,如果标志中有
SRE_INFO_PREFIX
或SRE_INFO_CHARSET
,则后面有更多。**LITERAL:**匹配文字字符串,用于短前缀,如果禁用快速搜索。
**MARK:**设置一个标记,可能是为了回溯。
所有可用的操作码,如果有人想尝试挖掘更多: