分两个部分,首先讲一下正则表达式的写法,然后是python和java中正则表达式的编程
零、正则表达式的一般理论
形式语言与自动机
一、正则表达式的一般写法
1、 操作符
*: 表示将前面模式匹配0次或者多次
+:表示将前面模式匹配0次或者多次
?:表示将前面模式匹配0次或者1次
{M,N}: 表示将前面模式匹配M次到N次
. :通配符
[] : 匹配字符组中的任意一个字符
[^] : 匹配补字符组中的任意一个字符
():子组 子表达式,可以对其使用各种操作符
|:两组模式中选一个 OR操作符
2、特殊记号:
\d : 匹配所有数字
\w: 匹配所有数字、字母
\s: 匹配所有空白符
3、例子:
例1:希望在一段字符串中匹配IP地址
“([0-9]*).([0-9]*).([0-9]*).([0-9]*)”
这样匹配了之后还需要检查
例2:把类似于下面这样的东西提取出他的信息
这是windows CMD中的一些个文件记录,如果是文件,那么中间表示其大小,如果是文件夹,则表示<DIR>,前面是
2019/05/04 15:22 329,909,920 CLion-2019.1.2.exe
2019/03/25 22:30 <DIR> CloudMusic
利用下面表达式即可
([0-9]{4}/[0-9]{2}/[0-9]{2})[ ]*([0-9]{2}:[0-9]{2})[ ]*(<DIR>|[0-9]{1,3}(,[0-9]{1,3})*)[ ]*(.*)",
例3:统计化学式子中的所有原子个数
例如:(CH3)2CHCOOH:
要求程序输出结果为: C4H8O2
如何解决这个问题?
首先可以获得一个book,记录所有的原子
这个正则表达式可以完成任务
“[A-Z][a-z]|[A-Z]”
这个用来分割,就是把括号的部分摘出来
((\w+))([0-9]*)
现在变成若干小段,每一段都不含括号,之后用一个
“([A-Z][a-z]|[A-Z])([0-9])*”
即可完成任务
二、python中的正则表达式
re包中实现了函数:
函数名 | 函数作用 |
---|---|
match(pattern, string): | 返回从头开始第一次匹配,通过返回值的group方法得到具体的串: |
search(pattern, string): | 返回第一次匹配,通过返回值的group方法得到具体的串: |
findall(pattern,string): | 返回一个匹配列表 |
通过这些方法,就可以完成匹配工作了
函数名 | 函数作用 |
---|---|
split(pattern, string): | 把所有匹配的地方做分割 |
sub(pattern, string): | 把所有匹配的地方做替换 |
例5:按空格分割,允许多个空格
re.split("[\s]*",“223 3213 3 123”)
这比split方法高级一些,可以实现随意的分割
例6:给出一篇英文文本,统计词频
word_list = re.findall("([A-Za-z]+)(’([ts]|re))?","".join(open(“D:/1.txt”).readlines()))
print(word_list)