Python 是否有任何编译器可以将regexp转换为fsm?或者可以转换成人类的语言?

Python 是否有任何编译器可以将regexp转换为fsm?或者可以转换成人类的语言?,python,regex,compiler-construction,fsm,Python,Regex,Compiler Construction,Fsm,可以转换的东西 r"a+|(?:ab+c)" 到 或者类似的东西 在2或5中,您有一个以更可读的形式打印regexp的: >>> import re >>> re.compile(r"a+|(?:ab+c)", flags=re.DEBUG) branch max_repeat 1 65535 literal 97 or subpattern None literal 97 max_repeat 1 65535 l

可以转换的东西

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

或者类似的东西

在2或5中,您有一个以更可读的形式打印regexp的:

>>> import re
>>> re.compile(r"a+|(?:ab+c)", flags=re.DEBUG)
branch
  max_repeat 1 65535
    literal 97
or
  subpattern None
    literal 97
    max_repeat 1 65535
      literal 98
    literal 99
<_sre.SRE_Pattern object at 0x0000000002325328>
>>重新导入
>>>重新编译(r“a+|(?:ab+c)”,标志=重新调试)
分支
最大重复次数165535次
文字97
或
子模式无
文字97
最大重复次数165535次
文字98
文字99

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

该库称为rxpy,存储库为

执行解析的例程是parse_模式

如果对结果调用
repr(…)
,则会得到一个“点语言”图形-

例如,请参见下面的测试:

为了说明我的意思,让我们看一下测试,
'ab*c'

"""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许可证)。

在我们的理论CS类中,我们确实有一种将正则表达式转换为FSM的方法。毕竟,这正是正则表达式引擎必须做的。
"""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
}"""