正则表达式
Python自1.5以后增加了re的模块,提供了正则表达式模式
re模块使Python语言拥有了全部的正则表达式功能
re模块简介
导入re模块
import re
re.match函数
原型:re.match(pattern,string,flags = 0)
参数:
patter 匹配的正则表达式
string 要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
值如下
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^ 喝$
re.S 是. 匹配包括换行符在内的所有字符
re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B
re.X 使我们以更灵活的格式理解正则表达式
功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置,匹配成功的话,返回None
re.search函数
原型 re.search(patter,string,flags =0)
参数
patter 匹配的正则表达式
string 要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
值如下
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^ 喝$
re.S 是. 匹配包括换行符在内的所有字符
re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B
re.X 使我们以更灵活的格式理解正则表达式
功能
扫描整个字符串,并返回第一个成功的匹配
re.findall函数
原型 re.findall(patter,string,flags =0)
参数
patter 匹配的正则表达式
string 要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
值如下
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^ 喝$
re.S 是. 匹配包括换行符在内的所有字符
re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B
re.X 使我们以更灵活的格式理解正则表达式
功能:
扫描整个字符串,并返回结果列表
正则表达式的元字符
匹配单个字符与数字
. 匹配除换行符以外的任意字符
[0123456789] []是字符集合,表示匹配方括号所包含的任意一个字符
[sunck] 匹配 ‘s‘,‘u‘,‘n‘,‘c‘,‘k‘ 中任意一个字符
[a-z] 匹配任意
[A-Z] 匹配任意大写字母
[0-9] 匹配任意数字,类似[0123456789]
[0-9a-zA-Z] 匹配任意的数字和字母
[0-9a-zA-Z_] 匹配任意的数字和字母和下划线
[^sunck] 匹配除了sunck这几个字母以外的所有字符,中括号里的^称为脱字符,表示不匹配集合中的字符
[^0-9] 匹配所有的非数字字符
\d 匹配数字,效果同[0-9]
\D 匹配非数字字符,效果同 [ ^ 0-9]
\w 匹配数字,字母和下划线 效果同[0-9a-zA-Z_]
\W 匹配非数字、字母和下划线,效果同[ ^0-9a-zA-Z_]
\s 匹配任意的空白符(空格、换行、换页,制表、回车),效果同[ \f\n\r\t]
\S 匹配任意的非空白符 效果同(^ \f\n\r\t)
锚字符(边界字符)
^ 行首匹配,和在[]里的^ 不是一个意思
$ 行尾匹配
\A 匹配字符串开始,它和^的区别是,\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首
\Z 匹配字符串结束,它和$的区别是,\Z只匹配整个字符串的结束,即使在re.M模式下也不会匹配它行的行尾
\b 匹配一个单词的边界,也就是此单词和空格间的位置
‘er\b‘ 可以匹配never,不能匹配nerve
\B 匹配非单词边界
匹配多个字符
说明:下方的x、y、z均为假设的普通字符,n,m(非负整数),不是正则表达式的元字符
(xyz) 匹配小括号里面的xyz(作为一个整体去匹配)
x? 匹配0个或者1个x
#非贪婪匹配(尽可能少的匹配)
x* 匹配0个或者任意多个x(.* 表示匹配0个或者任意多个字符(换行符除外))
#贪婪匹配(尽可能多的匹配)
x+ 匹配至少一个x
#贪婪匹配(尽可能多的匹配)
x{n} 匹配确定的n个x(n是一个非负整数)
x{n,} 匹配至少n个x,
#贪婪匹配(尽可能多的匹配)
x{n,m} 匹配至少n个最多m个x 注意:n<=m
x|y |表示或、匹配的是x或y
特殊
*? +? x? 最小匹配 通常都是尽可能多的匹配,可以使用这种解决贪婪匹配
(?:x) 类似(xyz),但不表示一个组
re模块深入
字符串切割
re.split(patter,string)
patter 匹配的正则表达式
string 要匹配的字符串
re.finditer函数
原型
re.finditer(patter,string,flags =0)
参数:
patter 匹配的正则表达式
string 要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
值如下
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^ 喝$
re.S 是. 匹配包括换行符在内的所有字符
re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B
re.X 使我们以更灵活的格式理解正则表达式
功能:与findall类似,扫描整个字符串,返回的是一个迭代器
字符串的替换和修改
re.sub(pattern,repl,string,count = 0,flags=0)
re.subn(pattern,repl,string,count =0,flags = 0)
参数
pattern : 正则表达式(规则)
repl : 指定的用来替换的字符串
string: 目标字符串
count: 最多替换次数
功能:
在目标字符串中,以正则表达式的规则匹配字符串,在把他们替换成指定的字符串,可以指定替换的次数,如果不指定,替换所有的匹配字符串
区别:
前者返回一个被替换的字符串,后者返回一个元组(第一个元素表示被替换的字符串,第二个元素表示被替换的次数)
分组
概念: 除了简单的判断是否匹配之外,正则表达式还有提取子串的功能。用()表示的就是提取分组
举例
str6 = "010-53247654"
m = re.match(r"(?P<first>\d{3})-(d{8}),str6)
?P<first> 是给组取名字
print(m.group(first)) 取的就是那组的数据
print(m.group(0))
print(m.group(1))
print(m.group(2))
使用序号获取对应组的信息,group(0)一直代表的原始字符串
print(m.groups())
查看匹配的各组的情况
编译
当我们使用正则表达式时,re模块会干两件事
编译正则表达式,如果正则表达式本身不合法,会报错
re.compile(pattern,flags=0)
pattern: 要编译的正则表达式
举例
pat = r"^1(([3578]\d)|(47))\d{8}$"
#编译成正则对象
re_telephon = re.compile(pat)
re_telephon .match(136000000)
用编译后的正则表达式去匹配对象