可以转化的东西
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许可证),欢迎您使用它。