编译原理(八) 之 正则表达式

简介: 编译原理(八) 之 正则表达式

概念

正则表达式 是一种用来描述正则语言的更紧凑的表示方法

比如某个语言L = {a}{a, b} * ( {ε} ∪ ( { . , _ } {a , b} { a, b }* ) )

利用正则表达式:

r = a (a | b) * (ε | (. | _) (a | b) (a | b)* )

正则表达式可以由较小的正则表达式按照特定规则 递归 地构建 , 每个正则表达式r 定义一个语言, 记为 L ® .这个语言也是根据r的子表达式所表示的语言递归定义的.


定义

ε 是一个正则表达式(RE) L (ε) = { ε }

如果a ∈ ∑ , 则a是一个RE, L(a) = {a}

假设r 和 s都是RE, 表示的语言分别是 L® 和 L (s) , 则:

r | s 是一个RE, L(r | s) = L ® ∪ L(s)

r s是一个RE, L(rs) = L®L(s)

r* 是一个RE, L(r*) = (L®)*

® 是一个正则表达式 L( ® ) = L®


优先级 * , 连接, |


例:

∑ = {a, b}, 则:

L(a | b) = L(a) ∪ L(b) = {a} ∪ {b} = {a, b}
L( (a | b) (a | b) ) = L(a | b) L (a | b) = {a, b} {a, b} = {aa, ab, ba, bb}
L(a*) = (L(a))* = {a}* = {ε, a, aa, aaa, .....}
L((a | b) *) = (L(a | b))* = {ε, a, b, aa, ab, ba, bb, .......} 
L(a | a* b) = {a, b, ab, aab, aaab , .....}

C语言中的 无符号整数的正则表达式

十进制整数

(1 | … | 9) (0 | … | 9)* | 0


八进制整数:

0 (1 | …| 7) (0 | …| 7)*


十六进制整数:

0x (1 | … | 9 | a | …| f) (0 | …| 9 | a | … | f)*


用正则表达式表示的语言叫做正则语言或者正则集合


RE的代数定律

定律

描述
r | s = s | r | 是可以交换的
r | (s | t ) = (r | s) | t |是可以结合的
r (s t)| (r s) t 连接是可以结合的
r (s| t) = r s | r t 或者 (s | t) r = sr | tr 链接对是可以分配的
εr = rε = r ε四连接的单位元
r* = (r | ε)* 闭包一定包含ε
r** = r* *具有幂等性


正则文法与正则表达式等价

任何正则文法G 存在定义同一语言的正则表达式r

任何正则表达式r, 存在生成同一语言的正则文法G


正则定义

正则定义是具有以下形式的定义序列

他们给一些RE命名, 并在之后的RE 中像使用字母表中符号一样使用这些名字

d1 -> r1

d2 -> r2

dn -> rn

每个di都是一个新符号, 他们都不在字母表∑中,并且各不相同

每个ri是字母表∑∪ {d1, d2, …di-1}上的正则表达式


C语言中的标识符正则定义

digit  -> 0 | 1 | 2 | .... | 9
letter_  -> A | B | ...| Z | a | b | ...| z | _
id -> letter_ (letter_ | dight) *

(整数或者浮点数) 无符号数的正则定义

digit -> 0 | 1 | 2 | … | 9

digits -> digit digit *

小数部分 -> .dights | ε

指数部分 -> ( E(+|-|ε)digits ) | ε

数字 -> digits 小数部分 指数部分

2 2.15 2.15E-3 2.15E3


相关文章
|
7月前
|
自然语言处理 算法 编译器
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
393 0
|
机器学习/深度学习 算法
编译原理之正则表达式转NFA
本文转载自http://chriszz.sinaapp.com/?p=257 输入一个正则表达式,输出一个NFA。 我的做法:输入一个字符串表示正则,输出则是把输出到一个.dot文件中并将dot文件编译成pdf,fedora需要sudo yum install dot,然后evince XXX.pdf就可以查看生成的NFA了。
2340 0
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r'string'`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
|
6月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
64 2
|
6月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
6月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
6月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。
|
6月前
|
Python
Python中re模块的正则表达式
【6月更文挑战第2天】了解Python的re模块,它是处理正则表达式的核心工具。正则表达式用于在文本中查找特定模式。本文讨论了re模块的用法和技巧,包括导入模块、匹配、分组、替换文本、编译正则表达式以及使用预定义字符类、量词、锚点等高级功能。通过实例展示了如何在Python中执行这些操作,帮助提升文本处理能力。掌握这些技巧将使你更有效地利用正则表达式解决字符串处理问题。
64 2
|
6月前
|
Python
Python正则表达式详解:掌握文本匹配的魔法
Python正则表达式详解:掌握文本匹配的魔法
|
6月前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
49 0