Python正则表达式实现原理_光环大数据Python培训

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python正则表达式实现原理_光环大数据Python培训
正则表达式便于我们理解使用,但是如何让计算机识别用正则表达式描述的语言呢?仍然以前面的[a|b]*abb为例,计算机如何识别[a|b]*abb的意义呢?首先我们来看判断输入内容是否匹配正则表达式的流程图:
图中一共有4个状态S0, S1, S2, S3,在每个状态基础上输入字符a或者b 就会进入下一个状态。

如果经过一系列输入,最终如果能达到状态S3,则输入内容一定满足正则表达式[a|b]*abb。

为了更清晰表述问题,将上图转换为状态转换表,第一列为当前状态,第二列为输入a后当前状态的跳转,第三列为输入b后当前状态的跳转。

其中S0为起始状态,S3为接受状态,从起始状态起经过一系列输入到达接受状态,那么输入内容即满足[a|b]*abb。

状态abS0S1S0S1S1S2S2S1S3S3S1S0
其实上图就是一个DFA实例(确定有限自动机),下面给出DFA较为严格的定义。

一个确定的有穷自动机(DFA) M 是一个五元组:M = (K, ∑, f, S, Z),其中:
K是一个有穷集,它的每个元素称为一个状态;
∑是一个有穷字母表,它的每个元素称为一个输入符号,所以也称∑为输入符号表;
f是转换函数,是在K×∑→K上的映射,如f(ki, a)→kj,ki∈K,kj ∈K就意味着当前状态为ki,输入符号为a时,将转换为下一个状态kj,我们将kj称作ki的一个后继状态;
S∈K是唯一的一个初态;
Z⊆K是一个状态集,为可接受状态或者结束状态。

DFA的确定性表现在转换函数f:K×∑→K是一个单值函数,也就是说对任
何状态ki∈K和输入符号a∈∑,f(k, a)唯一地确定了下一个状态,因此DFA
很容易用程序来模拟。

下面用字典实现[a|b]*abb的确定有限自动机,然后判断输入字符串是否满
足正则表达式。

123456789101112131415161718192021222324252627282930DFA_func = {0:
{“a”: 1, “b”: 0}, 1: {“a”: 1, “b”: 2}, 2:
{“a”: 1, “b”: 3}, 3: {“a”: 1, “b”:
0} }input_symbol = [“a”, “b”]current_state =
0accept_state = 3strings = [“ababaaabb”, “ababcaabb”, “abbab”]for string in strings: for char in string: if char
not in input_symbol: break else: current_state = DFA_func[current_state][char] if current_state == 3: print string, “—> Match!” else: print string, “—>No
match!” current_state = 0 “”“outputs: ababaaabb —> Match! ababcaabb —>No match! abbab —>No match! ““”
上面的例子可以看出DFA识别语言简单直接,便于用程序实现,但是DFA较
难从正则表达式直接转换。

如果我们能找到一种表达方式,用以连接正则表达式
和DFA,那么就可以让计算机识别正则表达式了。

事实上,确实有这么一种表达
方式,可以作为正则表达式和DFA的桥梁,而且很类似DFA,那就是非确定有限
自动机(NFA)。

还是上面的例子,如果用NFA表示流程图,就如下图所示:
看上去很直观,很有[a|b]*abb的神韵。

它转换为状态转换表如下:
状态abS0S0, S1S0S1ΦS2S2ΦS3S3ΦΦ
NFA的定义与DFA区别不大,M = (K, ∑, f, S, Z),其中:
K是一个有穷集,它的每个元素称为一个状态;
∑是一个有穷字母表,它的每个元素称为一个输入符号,ε表示输入为空,且ε不存在于∑;
f是转换函数,是在K×∑*→K上的映射,∑*说明存在遇到ε的情况,f(ki, a)是一个多值函数;
S∈K是唯一的一个初态;
Z⊆K是一个状态集,为可接受状态或者结束状态。

数学上已经证明:
DFA,NFA和正则表达式三者的描述能力是一样的。

正则表达式可以转换为NFA,已经有成熟的算法实现这一转换。

NFA可以转换为DFA,也有完美的实现。

这里不做过多陈述,想了解详情可以参考《编译原理》一书。

至此,计算机识别正则表达式的过程可以简化为:正则表达式→NFA→DFA。

不过有时候NFA转换为DFA可能导致状态空间的指数增长,因此直接用NFA识别正则表达式。

为什么大家选择光环大数据!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请大数据
领域具有多年经验的讲师,提高教学的整体质量与教学水准。

讲师团及时掌握时代的技术,将时新的技能融入教学中,让学生所学知识顺应时代所需。

通过深入浅出、通俗易懂的教学方式,指导学生较快的掌握技能知识,帮助莘莘学子实现就业梦想。

光环大数据启动了推进人工智能人才发展的“AI智客计划”。

光环大数据专注国内大数据和人工智能培训,将在人工智能和大数据领域深度合作。

未来三年,光环大数据将联合国内百所大学,通过“AI智客计划”,共同推动人工智能产业人才生态建设,培养和认证5-10万名AI大数据领域的人才。

参加“AI智客计划”,享2000元助学金!
【报名方式、详情咨询】
光环大数据网站报名:
手机报名链接:http:// /mobile/。

相关文档
最新文档