先贴一篇很好的正则表达式博文:https://www.cnblogs.com/darkterror/p/6474211.html
以及关于贪婪与懒惰匹配的博文:https://blog.csdn.net/wzygis/article/details/43339241
一.正则表达式的语法
1.正则表达式语法由字符和操作符构成。
2.正则表达式的常用操作符:
(1). 表示任何单个字符
(2)[ ] 字符集,对单个字符给出取值范围
(3)[^] 非字符集,对单个字符给出排除范围
(4)* 其哪一个字符0次或无限次扩展
(5)+ 前一个字符1次或无限次扩展
(6)? 前一个字符0次或1次扩展
(7)| 左右表达式任意一个
(8){m} 扩展前一个字符m次(只对大括号前的一个字符进行扩展)
(9){m,n} 扩展前一个字符m至n次(含n)
(10)^ 匹配字符串的开头 例:^abc表示abc且在一个字符串的开头
(11)$ 匹配字符串结尾 例:abc$表示abc且在一个字符串结尾
(12)( ) 分组标记,内部只能使用|操作符 例:(abc|def)表示abc,def
(13)\d 数字,等价于[0-9]
(14)\w 单词字符,等价于[A-Za-z0-9_]
二.Re库的基本使用
1.调用方式:import re
2.正则表达式的表示类型:
(1)raw string类型(原生字符串类型)
re库采用raw string类型表示正则表达式,表示为:r'text',raw string是不包含转义符的字符串
(2)string类型,更繁琐
3.当正则表达式包含转义符时,使用raw string
4.Re库主要功能函数:
(1)re.search():在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
(2)re.match():从一个字符串的开始位置匹配正则表达式,返回match对象
(3)re.findall():搜索字符串,以列表类型返回全部能匹配的子串
(4)re.split():将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
(5)re.finditer:搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素时match对象
(6)re.sub:在一个字符串中替换所有匹配字符串的子串,返回替换后的字符串
5.Re库的另一种等价用法:
(1)函数式用法:一次性操作
例:rst = re.search(......)
(2)面向对象用法:编译后的多次操作
pat = re.compile(r'[1-9]\d{5}') #将一个正则表达式字符串变异成为正则表达式类型,python对象)
rst = pat.search('BIT 100081') #用python对象调用search方法
6.正则表达式对象:
regex = re.compile(pattern, flags=0) compile函数将正则表达式的字符串编译成正则表达式对象
三.Re主要功能函数详解
1.re.search(pattern, string, flags=0)
(1)pattern:正则表达式的字符串或原生字符穿表示
(2)string:带匹配的字符串
(3)flags:正则表达式使用时的控制标记
re.I:忽略正则表达式大小写,[A-Z]能匹配小写字符
re.M:正则表达式中的^操作符能够将给定字符串的每行当作匹配开始(本来^操作符只匹配字符串的串首,使用re.M后可以匹配字符串每行的行首
re.S:正则表达式的.操作符能够匹配所有字符,默认匹配除换行符外的所有字符(设置re.s,可以匹配换行符)
2.re.match(pattern, string, flags=0)
3.re.findall(pattern, string, flags=0)
4.re.split(pattern, string, maxsplit=0, flags=0)
(1)maxsplit:最大分割数,剩余部分作为最后一个元素输出
5.re.finditer(pattern, string, flags=0)
6.re.sub(pattern, repl, string, count=0, flags=0)
(1)repl:替换匹配字符串的字符串
(2)count:匹配的最大替换次数
四.Re库的match对象
1.match对象的属性:
(1).string 带匹配的文本
(2).re 匹配时使用的pattern对象(正则表达式)
(3).pos 正则表达式搜索文本的开始位置
(4).endpos 正则表达式搜索文本的结束位置
2.match对象的方法
(1).group(0):获得匹配后的字符串
(2).start():匹配字符串在原始字符串的开始位置
(3).end():匹配字符串在原始字符串的结束位置
(4).span():返回(.start(), .end())
五.Re库的贪婪匹配和最小匹配
1.Re库默认采用贪婪匹配,即输出匹配最长的子串
例:match = re.search(r'PY.*N', 'PYANBNCNDN')
match.group(0)
结果:PYANBNCNDN
分析:实际上在该原始字符串中,PYAN,PYANBN,PYANBNCN,PYANBNCNDN,都满足正则表达式,但结果输出了其中最长的PYANBNCNDN,这就叫贪婪匹配.
2.最小匹配:输出最短的字符串(在正则表达式中加一个?)
例;match = re.search(r'PY.*?N', 'PYANBNCNDN')
match.group(0)
结果为:PYAN
3.最小匹配操作符:
(1)*?:前一个字符0次或无限次扩展,最小匹配
(2)+?:前一个字符1次或无限次扩展,最小匹配
(3)??:前一个字符0次或1次扩展,最小匹配
(4){m, n}:扩展前一个字符m至n次(含n),最小匹配