gpt4 book ai didi

python - 如何将正则表达式转换为 NFA?

转载 作者:太空狗 更新时间:2023-10-30 01:29:29 39 4
gpt4 key购买 nike

Python 中是否有任何模块可以将正则表达式转换为相应的 NFA,还是我必须从头开始构建代码(通过将正则表达式从中缀转换为后缀,然后实现 Thompson's Algorithm 以获得相应的 NFA)?

在 Python 中是否可以从转换表中获取 NFA 的状态图?

最佳答案

regex=''.join(postfix)

keys=list(set(re.sub('[^A-Za-z0-9]+', '', regex)+'e'))

s=[];stack=[];start=0;end=1

counter=-1;c1=0;c2=0

for i in regex:
if i in keys:
counter=counter+1;c1=counter;counter=counter+1;c2=counter;
s.append({});s.append({})
stack.append([c1,c2])
s[c1][i]=c2
elif i=='*':
r1,r2=stack.pop()
counter=counter+1;c1=counter;counter=counter+1;c2=counter;
s.append({});s.append({})
stack.append([c1,c2])
s[r2]['e']=(r1,c2);s[c1]['e']=(r1,c2)
if start==r1:start=c1
if end==r2:end=c2
elif i=='.':
r11,r12=stack.pop()
r21,r22=stack.pop()
stack.append([r21,r12])
s[r22]['e']=r11
if start==r11:start=r21
if end==r22:end=r12
else:
counter=counter+1;c1=counter;counter=counter+1;c2=counter;
s.append({});s.append({})
r11,r12=stack.pop()
r21,r22=stack.pop()
stack.append([c1,c2])
s[c1]['e']=(r21,r11); s[r12]['e']=c2; s[r22]['e']=c2
if start==r11 or start==r21:start=c1
if end==r22 or end==r12:end=c2

print keys

print s

这是 postfix 之后的大部分代码示例。 s 包含转换表,keys 包含所有使用的终端,包括 ee 用于 Epsilon

完全基于Thompson's Algorithm .

关于python - 如何将正则表达式转换为 NFA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17983289/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com