Python 如何检查我的线路是否与NFA匹配?

Python 如何检查我的线路是否与NFA匹配?,python,algorithm,nfa,automaton,Python,Algorithm,Nfa,Automaton,我制作了NFA,它从正则表达式生成3d数组,例如(01*)表达式。我明白了: [[FROM,TO,TRANSITION]] [['q0', 'q1', '0'], ['q1', 'q2', ':e:'] ,['q1', 'q4', ':e:'] , ['q2', 'q3', '1'], ['q3', 'q2', ':e:'], ['q3', 'q4', ':e:'] 如何编写一个方法来测试满足此自动机的字符串?例如“011111”将返回q0 q1 q2 q3 q3 q2 q3

我制作了NFA,它从正则表达式生成3d数组,例如(01*)表达式。我明白了:

[[FROM,TO,TRANSITION]]

    [['q0', 'q1', '0'], ['q1', 'q2', ':e:'] ,['q1', 'q4', ':e:'] ,
    ['q2', 'q3', '1'], ['q3', 'q2', ':e:'], ['q3', 'q4', ':e:']
如何编写一个方法来测试满足此自动机的字符串?例如
“011111”
将返回
q0 q1 q2 q3 q3 q2 q3 q3 q2 q3 q3 q3 q3 q2 q3 q3 q3 q3 q3 q4

  • 您可以将自动机转换为DFA(在检查变得不重要之后)。这种方法很有用,因为NFA很小,但要测试的字符串数量相当大

  • 您还可以构建一个每个顶点成对的新图(NFA的状态,字符串中的位置)。如果是epsilon变换,每个位置的一个状态和另一个状态之间都有一条边。如果自动机中的
    s->s'
    转换的字符与字符串中位置
    pos
    处的字符匹配,则还有一条边
    (s,pos)->(s',pos+1)

    构建图形后,您只需检查一对
    (t,string.length())
    对于至少一个终端状态
    t
    (您可以使用任何图形遍历算法进行检查,例如深度优先搜索)


  • 那么,如果自动机是确定性的,你知道怎么做吗?(如果知道,应用搜索引擎foo的算法来构建DFA)有很多现有的库可以使用,因此你不必重新发明weel。我建议为Java开发一个工业级的、易于使用的自动化包。这正是你想要的。如果您需要更多关于为了匹配给定字符串而进行了哪些特定转换的信息,那么扩展Automaton类也非常容易?似乎“q4”是一个接受的状态——但这是在哪里表达的呢?保罗·汉金,很抱歉我忘了。你写对了