python 正则表达式 re模块
# 正则表达式:python1.5后增加了re模块,提供了正则表达式模式,re模块使python语言拥有了全部的正则表达式的功能
re函数
import re '''
re.match()函数:
原型:match(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式(
re.I(忽略大小写)常用
re.L(做本地化识别)一般不用
re.M(多行匹配),影响^和$
re.S(使.匹配包括换行符在内的所有字符)常用
re.U(根据Unicode字符集解析字符,影响\w \W \b \W)
re.X(以更灵活的格式理解正则表达式));
功能:尝试从字符串的起始位置匹配一个模式。如果不是起始位置匹配成功的话,也会返回None,
''' # 网址:是不是以www开头的 print(re.match("www","www.baidu.com"))
print(re.match("www","www.baidu.com").span())
print(re.match("www","Www.baidu.com"))
print(re.match("www","Www.baidu.com",flags=re.I)) '''
re.search()函数
原型:search(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式
功能:扫描整个字符串并返回第一个成功的匹配
''' print(re.search("sunck","good man is sunck!sunck is nice")) '''
re.findall()
原型:findall(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式
功能:扫描整个字符串并返回结果列表
''' print(re.findall("sunck","good man is sunck!sunck is nice"))
re模块深入
字符串切割
str1 = "sunck is a good man" print(re.split(r" +",str1)) '''
re.finditer():
原型:finditer(pattern,string,flags=0);
参数:pattern:匹配的正则表达式,
string:受匹配的字符串,
flags:标志位,用于控制正则表达式的匹配方式
功能:与findall类似,扫描整个字符串,返回的是一个迭代器
''' str2 = "sunck is a good man!sunck is anice man!sunck is a handsome man" d = re.finditer(r"(sunck)",str2) while True:
try:
l = next(d)
print(d)
print(l)
except StopIteration as e:
break
字符串的替换和修改
'''
re.sub(pattern,repl,string,count=0,flags=0)
re.subn(pattern,repl,string,count=0,flags=0)
参数:pattern:匹配的正则表达式,
repl:指定的用来替换的字符串
string:目标字符串,
count:最多替换次数
flags:标志位,用于控制正则表达式的匹配方式
功能:在目标字符串中,以正则表达式的规则匹配字符串,再把他们替换成指定的字符串,可以指定替换的次数,如果不指定,他会替换所有的匹配字符串
sub和subn的区别:sub返回被替换的字符串,subn返回的是一个元组,第一个元素是被替换你的字符串,第二个是被替换的次数
''' str3 = "sunck is a good good good man" print(re.sub(r"(good)","nice",str3))
print(type(re.sub(r"(good)","nice",str3)))
print(re.subn(r"(good)","nice",str3))
print(type(re.subn(r"(good)","nice",str3)))
分组:除了简单的判断是否匹配之外,正则表达式还有提取字符串的功能,用()表示就是提取分组
str4 = "010-12345678" m = re.match(r"(?P\d{3})-(?P\d{8})" ,str4)
print(m) # 使用序号获取对应组的信息;0代表的是原始字符串,1代表第一组括号中提取信息,2代表第二组括号中提取的信息 print(m.group(0)) # 查看匹配的各组的情况 print(m.groups()) # ?p<>是给正则表达式起名字,group可以通过名字提取数据 print(m.group("first"))
注:当我们使用正则表达式时,re模块会干两件事
1、编译正则表达式,如果正则表达式本身不合法,会报错
2、用编译后的正则表达式去匹配对象
re.compile(pattern,flags=0)
pattern:要编译的正则表达式
pat = r"^1(([3578]\d)|(47))\d{8}$" # 编译成一个正则对象 print(re.match(pat,"13600001111"))
re_telephon = re.compile(pat)
print(re_telephon.match("13600001111"))