字符串的处理
涉及字符串形式的处理,未涉及字符串的意义
一般的字符串匹配
某个特定的字符串--一个模式串
某种形式的字符串匹配--一组模式串
通配符和正则表达式 * ?
通配符(wildcard),通配符可以用*来匹配任意字符
使用场景:通配符多用在文件名上,比如查找find,ls,cp
正则表达式<Regular Expression>
字符串匹配模式:复杂的字符串搜寻、替换工作,
无法用简单的方式(类似借助标准库函数)达成
正则表达式,*只匹配任意长度的前面的字符
1.正则表达式构成
1.正则表达式
字符簇--匹配规则<元字符 分枝条件>--匹配结果
贪婪与懒惰
2.元字符 metacharacter
位置:定位符
^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。
数量:限定符:
要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
* + 和 ? 限定符都是贪婪的
-----数量词的贪婪模式与非贪婪模式
字符类和数字类 以及反义<包括以及排除>
[ ]
注意:不能将限定符与定位符一起使用
3.转义字符--反斜杠问题
使用\来取消这些字符的特殊意义
脱离元字符属性
4.括号
圆括号()是组
方括号是单个匹配 字符集/排除字符集/命名字符集,[]是定义匹配的字符范围
2.正则表达式类型
1.流派flavor:正则引擎
是否区分大小写
比较NFA与DFA
词法分析器的任务就是将字符流转换成词法记号流
有穷自动机分为两类,即
不确定的有穷自动机NFA
确定的有穷自动机DFA
场景:文本处理
断言 捕获
2.具体
01、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
02、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
03、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
DFA :awk mysql
传统型NFA Python sed vi
POSIX NFA:
DFA/NFA 混合 awk grep egrep
3.解决问题逻辑
必须出现
可能出现
不能出现
常见操作:
提取--替换--切分
验证
3.各种语言的正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern)
<1>实现哪些功能:查找,替换,分割
<2>具体实现方式: 各种语言的方式--如何创建正则表达式
<3>多个模式如何构造在一起
组合方式:或 的关系 使用 |
子表达式
原生字符串 和特殊字符串
C语言
C语言本身不具备RE特性,但是有很多库,在Linux下你可以很方便的使用regex.h提供的库
Java--Java中使用正则表达式方式 有两种
01.String类自带的正则表达式工具-
-split() 以正则表达式对字符串进行分割
02.包-regex
import java.util.regex
Pattern类
生成Matcher对象
Scala
-split() 以正则表达式对字符串进行分割
以字符为分割符进行分割--对Java中的split添加了重载的方法
var s ="this. Iam.hello"
s.split("\\.") 以正则表达式对字符串进行分割,得到一个分割后的字符串数组
s.split("l") 以字符为分割符进行分割-遇到特殊元字符 记得转义
Shell
切分字符串-- cut
工具
sed工具,sed本身也是一个管道命令,常用于一行
awk工具
grep
扩展型正则 egrep
Python--采用面向对象式的方式
Python语言中的正则表大会 标准包re提供
01.提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,
然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操
02.字符串--raw string 原始字符串,在普通字符串文字前加r 或者R前缀
单引号和双引号前的反斜杠
假如你需要匹配文本中的字符”\”,
方式01. 使用编程语言表示的正则表达式里将需要4个反斜杠”\\\\”
方式02.使用原生字符串
匹配迭代器--区分大小写
03. 正则表达式对象--re模块的compile()函数编译得到
正则表达式匹配对象 -----调用正则表达式对象的regex.match()、regex.fullmatch()和regex.search()得到的结果就是
方式一:使用步骤
0. 引用到程序中
01.生成字符串表达式对象
re.complie(pattern,flag=0)
02.检索--匹配--分割等
re.search() 、re.match() 、re.split()、 re.sub()
案例:
import re
key = r"<html><body><h1>hello world<h1></body></html>"#这段是你要匹配的文本
p1 = r"(?<=<h1>).+?(?=<h1>)"#这是我们写的正则表达式规则,你现在可以不理解啥意思
pattern1 = re.compile(p1)#我们在编译这段正则表达式
matcher1 = re.search(pattern1,key)#在源文本中搜索符合正则表达式的部分
print matcher1.group(0)#打印出来
方式二:
pattern1.search() pattern1.match() pattern1.split() pattern1.sub()
R语言
使用字符串操作函数
字符串匹配:grep() gerpl()
grep()负责搜索给定字符串对象中特定表达式 ,并返回其位置索引。
grepl()函数与之类似,但其后面的"l"则意味着返回的将是逻辑值。
regexpr、gregexpr和regexec
这三个函数返回的结果包含了匹配的具体位置和字符串长度信息,
可以用于字符串的提取操作
字符串替代 :sub() gsub( )
gsub()负责搜索字符串的特定表达式,并用新的内容加以替代。
sub()函数是类似的,但只替代第一个发现结果。
字符串分割:strsplit()
字符串粘合:paste()负责将若干个字符串相连结,返回成单独的字符串
字符串截取:substr()能对给定的字符串对象取出子
substr返回的字串个数等于第一个参数的长度
而substring返回字串个数等于三个参数中最长向量长度,短向量循环使用
01. 参数设置--设置为正则表达式 fixed=FALSE
02.对 点号脱离元字符属性, 同时反斜杠本身也是元字符属性
\\.
例如: grep("\\.", c("abc", "f.g"))
strsplit(x, split, fixed= F, perl= F, useBytes= F)
03. ##普通字符串
strsplit("f.g",".",fixed=T)
##正则表达式功能
strsplit("f.g","\\.",fixed=F)
split--分组因子,用于分组
SQL
模糊匹配--正则表达式
Oracle
regexp_substr 函数使用正则表达式来指定返回串的起点和终点
regexp_instr
regexp_replace
regexp_like
MySQL
<1>MySQL用WHERE子句对正则表达式提供了初步的支持
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
Hive
01.split() split的第二个参数是一个regex,而‘?’有特殊的意义因此需要被转义。
02. 正则表达式替换函数:regexp_replace
语法: regexp_replace(string A, string B, string C)
返回值: string
说明:将字符串A中的 符合java正则表达式B 的部分替换为C。
注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。
举例:
hive> select regexp_replace('foobar', 'oo|ar', '') from lxw_dual;
fb
正则表达式解析函数:regexp_extract
语法: regexp_extract(string subject, string pattern, int index)
返回值: string
说明:将字符串subject依照pattern正则表达式的规则拆分。返回index指定的字符。
举例:
附录
1.编译器设计原理--
本地编译器--交叉编译器
编译器进行语法分析--语义分析-目标文件-链接器
分析程序生成器(Parser Generator)
汇编编写第一个--然后迭代生成
2.Latex:生成复杂表格和数学公式和排版
它的格式化引擎 TeX
参考: