【发布时间】:2016-04-04 01:29:30
【问题描述】:
强调一下,我不想“使用正则表达式解析”——我想“将正则表达式解析为符号树”。 (搜索只找到了前者……)
我的用例:为了加快对数据库的正则表达式搜索,我想解析像 (foo|bar)baz+(bat)* 这样的正则表达式并提取所有必须出现在匹配项中的子字符串。 (在这种情况下,它只是baz,因为 foo/bar 是交替出现的,而 bat 可以出现 0 次。)
为此,我需要对正则表达式运算符/语义有所了解。 re.DEBUG 最接近:
In [7]: re.compile('(foo|bar)baz+(bat)', re.DEBUG)
subpattern 1
branch
literal 102
literal 111
literal 111
or
literal 98
literal 97
literal 114
literal 98
literal 97
max_repeat 1 4294967295
literal 122
subpattern 2
literal 98
literal 97
literal 116
但是,它只是打印出来,据我所知,c 实现并没有保留之后的结构。关于如何在不编写所有者解析器的情况下解析它的任何想法?
【问题讨论】:
-
如何在正则模式上使用正则表达式?
-
@DanielSanchez 你不能用正则表达式解析正则表达式。
-
@BlackJack,你可以对正则表达式字符串进行正则表达式,我的意思是如果我的正则表达式有“1|2”,你可以正则表达式那个字符串。
-
@DanielSanchez 您可以对
1|2执行此操作,但不能对任意正则表达式执行此操作。您不能像问题所问的那样将正则表达式转换为符号树,您需要一个用于上下文无关语法的解析器,就像 Ira Baxter 的回答所解释的那样。