可以转化的东西

r"a+|(?:ab+c)"


{
    (1, 'a') : [2, 3],
    (2, 'a') : [2],
    (3, 'b') : [4, 3],
    (4, 'c') : [5]
}

或类似的东西

并接受2或5

最佳答案

我有一些代码可以做到这一点。它没有很好的文档记录,也不受支持,但是如果您有兴趣,欢迎查看。

该库称为rxpy,存储库为http://code.google.com/p/rxpy

进行解析的例程是http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/pattern.py#871的parse_pattern

如果您对结果调用repr(...),则会得到“点语”形式的图形-https://en.wikipedia.org/wiki/DOT_language

例如,将测试视为http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/_test/parser.py#47

为了说明我的意思,让我们看一下'ab*c'http://code.google.com/p/rxpy/source/browse/rxpy/src/rxpy/parser/_test/parser.py#234测试:

"""digraph {
 0 [label="a"]
 1 [label="...*"]
 2 [label="b"]
 3 [label="c"]
 4 [label="Match"]
 0 -> 1
 1 -> 2
 1 -> 3
 3 -> 4
 2 -> 1
}"""

0开头,可以匹配“a”进入状态1。从那里,您可以匹配“b”进入2或匹配“c”进入3。状态2然后又转换回1,可以消耗另一个“b”,以此类推。手工读取有点难看,但是当测试失败时,屏幕上会显示一些图形。

该库还具有各种“引擎”,可以将字符串与此图进行匹配(正则表达式匹配也是如此)。但是它比python库要慢得多(因为它是纯python)。

不支持此功能,可能不太清楚-抱歉-但我认为它很接近您想要的,如果有用(MPL或LGPL许可证),欢迎您使用它。

10-08 18:33