从正则表达式(RE)到最小确定性有限状态自动机(DFA)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从正则表达式(RE)到最小确定性有限状态自动机(DFA)相关的知识,希望对你有一定的参考价值。

参考技术A RE(Regular Expression)到最小DFA(Deterministic Finite Automaton)的转换是构建正则表达式引擎的基础,并且也是构建词法分析器的基础.

RE描述了一个定义在某个字母表Σ上的字符串集合L,并且空字符串ε也属于L集合.形式化的定义并不好理解,但是相对其他非形式化的定义来说更加简洁和准确.这里的正则表达式和平常所用的处理字符串的正则表达式是同一个,但是这里更加简单.这里的RE只有三个基本的操作:
(1)选择 取并集.符号:|. 比如两个字符串集合R和S的选择操作,记作R|S.
(2)连接 字符串之间的拼接.两个字符串集合R和S的连接为RS.
(3)闭包 符号:* 字符串集合R的闭包R*是指把R与自身连接零次或者多次形成的所有集合的并集.
  由这几个简单的操作可以得到我们平常接触的正则表达式的所有扩展.

我说的时候喜欢加上状态两个字,因为FA的关键动作就是状态间的转移.FA有一个状态集S,对于每一个输入都会让FA的状态进行转移.如果能够从起始状态转移到接受状态,那么输入序列就被识别了.不存在空字符串ε的状态转移.
  非确定性有限状态自动机(Non-deterministic Finite Automaton,NFA).对于同一输入转移到多个不同的状态或者存在空字符串ε的状态转移的FA.
  确定性有限状态自动机(Deterministic Finite Automaton,DFA).对于任何确定的输入都只有唯一确定的转移且不存在空字符串ε的状态转移的FA.

上面描述的RE的基本操作的简单NFA:

NFA到DFA 是对NFA的简化过程.
  NFA到DFA的子集构造算法(The Subset Construction):从将初始状态划分为一个初始状态子集开始,构造状态子集(经过零个或多个空字符串ε转移到的状态和已在子集中的状态都是构造的新的状态子集),存在c属于字母表Σ,经过一个c的转移(必须有c的转移),能够使得从状态子集ni转移到状态子集nj,则在DFA中有在c的输入下从状态子集ni转移到状态子集nj的转移.最后不再有新的状态子集出现.根据状态子集的转移依次构造DFA.

最小化DFA用到的是等价状态集合的划分来构建.一开始只有两个状态集,一个接受状态集合,一个非接受状态集合.对于每一个状态集合Sp,如果存在c属于字母表Σ,使得Sp中的状态转移到不同的状态集合(包括没有转移的空状态集合),则拆分Sp,使得拆分后的状态集合中的每一个状态不可能转移到不同的状态集合.其中状态集合之间的转移构成最小化DFA中的转移.

python re 模块小结

前言:

本人环境windows 7 64位,python2.7

 

re是什么:

regular expression缩写,意为正则表达式,是python的众多模块之一

 

re用途:

从文本中有选择的批量抽取想要的文本碎片

 

re类型:

分为DFA(确定的有穷状态自动机)NFA(非确定的有穷状态自动机)

 

re的安装:

打开DOSCDpip目录下;输入命令pip install re

 

re常用方法:

1.re.compile(pattern, flags=0)

  patternstr类型的,例:pattern  = r‘^.*?$’

2.re.findall(pattern, string, flags=0)

  Return a list of all non-overlapping matches in the string.返回字符串中所有非重叠匹 配的列表。

  例1print re.findall(r’(s)(d)’, ‘gsd sd fsa ggh sd hf sdgf ’)

  结果:[(‘s‘, ‘d‘), (‘s‘, ‘d‘), (‘s‘, ‘d‘), (‘s‘, ‘d‘)]

  例2print re.findall(r‘(s)d‘,‘gsd sd fsa ggh sd hf sdgf‘)

  结果:[‘s‘, ‘s‘, ‘s‘, ‘s‘]

  例3print re.findall(r‘sd‘,‘gsd sd fsa ggh sd hf sdgf‘)

  结果:[‘sd‘, ‘sd‘, ‘sd‘, ‘sd‘]

  用途:抽取网页源代码中的链接等

3.re.split(pattern, string, maxsplit=0, flags=0)

    Split the source string by the occurrences of the pattern,

    returning a list containing the resulting substrings.返回list

  例:print re.split(r‘s‘,‘jsjkjoishioshuisguusnjshbsg‘)

  结果:[‘j‘, ‘jkjoi‘, ‘hio‘, ‘hui‘, ‘guu‘, ‘nj‘, ‘hb‘, ‘g‘]

  用途:将大段文本分成易于处理的小片段

4.re.match(pattern, string, flags=0)

    Try to apply the pattern at the start of the string, returning

    a match object, or None if no match was found.返回的object类似指针

5.re.search(pattern, string, flags=0)

    Scan through string looking for a match to the pattern, returning

    a match object, or None if no match was found.返回的object类似指针

 

 

参考资料:IDLEhelp命令;

后记:如有错漏,欢迎指正,有时间就更新

本文是博主原创,转载请注明出处,并@我心飞翔2015,谢谢合作!

以上是关于从正则表达式(RE)到最小确定性有限状态自动机(DFA)的主要内容,如果未能解决你的问题,请参考以下文章

编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从NFA到DFA的转换

用java开发编译器之:Thompson构造,将正则表达式转换为有限状态自动机

如何将 DFA 转换为正则表达式?

LeetCode 65 有效数字[正则 有限状态自动机] HERODING的LeetCode之路

DFA确定化和最小化

编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从正则表达式构造NFA