通过该re.DEBUG标志可以了解 Python 中正则表达式模式的内部工作原理,例如:
import re
re.compile(r"(a(?:b)){1,3}(c)", re.DEBUG)
Run Code Online (Sandbox Code Playgroud)
返回:
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
Run Code Online (Sandbox Code Playgroud)
在哪里可以找到操作码(SUBPATTERN、MAX_REPEAT 等)的含义?其中一些是不言自明的,但整体目的尚不清楚。是什么1 0 0意思SUBPATTERN 1 0 0?
我尝试过的一些事情:
注意:我知道这可能不太适合 StackOverflow 问题,但我已经用 MRE 写了一个明确的问题,并为解决当前问题做出了努力。此外,我认为解决这个问题也有利于其他用户。
小智 4
我想我可以回答你的大部分问题,但也许不能回答全部。所以操作码是 python 模块内部的一部分re,并且似乎并不意味着面向用户。
也就是说,
MAX_REPEAT 1 3表示模式重复 1 到 3 次。
LITERAL只是一个字符文字(例如“a”的 ascii 是 97)。
SUBPATTERN 1 0 0匹配第一个子模式(例如组),SUBPATTERN 2 0 0匹配第二个子模式等。据我所知,这里的 0 只是未使用的占位符,但这是我不是 100% 清楚的部分。
无论如何,如果您实际上正在尝试调试某些正则表达式,我建议您使用许多不错的在线正则表达式调试器之一(例如https://regex101.com/)。