项目地址:Regex in Python 前两篇已经完成的写了一个基于NFA的正则表达式引擎了,下面要做的就是更近一步,把NFA转换为DFA,并对DFA最小化 DFA的定义 对于NFA转换为DFA的算法,主要就是将NFA中可以状态节点进行合并,进而让状态节点对于一个输入字符都有唯一的一个跳转节点 所以对于DFA的节点就含有一个nfa状态节点的集合和一个唯一的标识和对是否是接收状态的flag class Dfa(object): STATUS_NUM = 0 def __init__(self):…
前言 项目地址:Regex in Python 开学摸鱼了几个礼拜,最近几天用Python造了一个正则表达式引擎的轮子,在这里记录分享一下. 实现目标 实现了所有基本语法 st = 'AS342abcdefg234aaaaabccccczczxczcasdzxc' pattern = '([A-Z]+[0-9]*abcdefg)([0-9]*)(\*?|a+)(zx|bc*)([a-z]+|[0-9]*)(asd|fgh)(zxc)' regex = Regex(st, pattern) res…
项目地址:Regex in Python 在看一下之前正则的语法的 BNF 范式 group ::= ("(" expr ")")* expr ::= factor_conn ("|" factor_conn)* factor_conn ::= factor | factor factor* factor ::= (term | term ("*" | "+" | "?"))* term…
简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA代码,实现一个支持常用功能的正则表达式引擎.它支持贪婪匹配和懒惰匹配:支持零宽度字符(如"\b", "\B"):支持常用字符集(如"\d", "\s"等):支持自定义字符集("[a-f]","[^b-…
Python自带了正则表达式引擎(内置的re模块),但是不支持一些高级特性,比如下面这几个: 固化分组    Atomic grouping 占有优先量词    Possessive quantifiers 可变长度的逆序环视    Variable-length lookbehind 递归匹配    Recursive patterns (起始/继续)位置锚\G    Search anchor 幸好,在2009年,Matthew Barnett写了一个更强大正则表达式引擎——regex模块,…
整个引擎代码在github上,地址为:https://github.com/sun2043430/RegularExpression_Engine.git nullable, firstpos, lastpos, followpos函数介绍 接着上两篇文章 <正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——1 概述> <正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——2 构造抽象语法树> 本篇将讲解对抽象语法树上的每一个节点计算对应的4个函数:nullabl…
正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,<编译原理>一书中有一章专门讲解了怎么基于状态机来构建基本的正则表达式引擎,它讲这个初衷是为词法分析服务,不过书里的东西相对偏理论了些,实现起来还是要费些功夫的,只是它到底指明了一条路,当然,书里只针对基本的语法进行了分析讲解,对于在实际中很多非常有用的扩展语法,它就基本没有涉及了,这些扩展的语法中有些是比较好实现的,有些则比较难. 基本…
今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表达式验证匹配,提取等一些基本的知识,今天继续分享下它的另一个强大的应用:替换(replace). 开始之前,还是要补一下昨天的内容. 在我们昨天的内容里,有一个提取组的概念,在上一节中,我么只用了数值索引来获取某组的value.我们还可以给某个组取一个别名,然后通过别名来找到相应的组的value. 我们还拿昨天的name和age那个例子说明: 1 //----------------------------------通过数值索引--…
原文地址:http://www.cnblogs.com/feng-c-x/archive/2013/09/05/3302465.html 今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表达式验证匹配,提取等一些基本的知识,今天继续分享下它的另一个强大的应用:替换(replace). 开始之前,还是要补一下昨天的内容. 在我们昨天的内容里,有一个提取组的概念,在上一节中,我么只用了数值索引来获取某组的value.我们还可以给某个组取一个别名,然后通过别名来找到相应的组的value.…
正则表达式引擎:nfa的转换规则. 正则到nfa 前言 在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换.可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码.为了简化代码,我实现了我自己的re到nfa的规则. 注意我的这套re规则只包括如下几种类型: 闭包,即*运算符 一个或多个,即+运算符 存在或不存在,即?运算符.这三个运算符的优先级最高而且都是单目运算符. 括号括起来的,即成对的括号,其实也不算运算符,只能当作分隔符. 中括号括起来的,作为…