Python的正则表达式,主要使用re模块
re模块为Python自带的模块,不需要单独安装,引入re模块:import re。
1. re.match(pattern,string,flags=0)
功能:尝试从字符串起始位置匹配一个字符串,如果不是起始位置或不匹配,则返回值为None。
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的方式。
re.I: 忽略大小写。
re.L: 做本地化识别。
re.m: 多行匹配。影响^和$。
re.s:是匹配包括换行符在内的所有字符。
re.u:根据Unicode字符解析。
re.x:以更灵活的格式理解正则。
例如:print(re.match("www","WWW.www.baidu.com.www",flags=re.I))
运行结果:<_sre.sre_match object span="(0," match="WWW">
span(0,3)表示开始位置和结束位置
2. re.search(pattern,string,flags=0)
功能:在整个字符串中找到第一个匹配成功的。匹配成功后,返回字符串位置。
例如:print(re.search("www","aaa.WWW.baidu.com.www"))
运行结果:<_sre.sre_match object span="(18," match="www">
3.正则表达式的pattern写法
“.”:可以匹配除换行符意外的任意字符。如果加上re.flags=s 就可以匹配换行符。
“[]”:[]是字符集合,匹配括号中包含的任意字符.
例如:[0123456789] 或者[0-9]或者[\d]:表示匹配0-9中所有的数字
[a-z]:表示匹配任意的小写字母
[a-zA-Z0-9]:表示匹配所有的大小写字母和数字
“[^]”: 例如[^ails]:匹配除了a,i,l,s,这几个之外的所有字符。[^]称为脱字符。
\w:匹配数字,字母和下划线。
\W:匹配非数字,字母和下划线,等同于^\w。
\s:匹配任意空白符,包括空格,回车,换页,制表。
\S:等同于^\s。
边界字符:“^”匹配行首,“$”匹配行尾。 例如:print(re.search("^aa","aab.WWW.baidu.com.www")) 运行结果:<_sre.sre_match object span="(0," match="aa">
\A:只匹配整个字符串开始。
\Z:匹配整个字符串结束,即使在re.M模式下。
3. 匹配多个字符串
re.findall(pattern,string,flags=0)
功能:找到所有匹配的字符串,返回字符串列表。
例如:print(re.findall("www","www.www.baidu.com.www"))
运行结果:['www', 'www', 'www']
x?:尽可能少的匹配,0个或1个字符。(x可以是任意字符串,后面不再赘述)
x*:尽可能多的匹配,1个或n个字符。
x+:匹配至少一个x字符串。
x{n}:匹配确定的n个字符串。例如:print(re.findall("w{2}","www.www.baidu.com.www")) 运行结果:['ww', 'ww', 'ww']
x{n.}:至少匹配n个字符串。
x{n,m}:至少匹配n个,至多匹配m个。
x|y:匹配x或者y字符串。例如:print(re.findall("www|baidu","www.www.baidu.com.www")) 运行结果:['www', 'www', 'baidu', 'www']
4.找到对应的字符串,并拆分字符串
re.split(pattern,string,maxsplit=0,flags=0)
maxslpit:表示最多切割多少次。
功能:找到与正则表达式条件相符合的字符串,对整个字符串进行拆分。返回一个字符串列表。
例如:print(re.split(r"\.+","www.www.baidu. com. www")) 注意:‘\.’ 意思是转义‘.’ 这个符号。
运行结果:['www', 'www', 'baidu', ' com', ' www']
5.不占用过多内存的方式,找到对应的字符串。
re.finditer(pattern,string,flags=0)
功能:扫描整个字符串,返回一个迭代器。
例如:
d=re.finditer(r"www","wwww.www.www.baidu.com.www")
while True:
try:
l=next(d)
print(d)
except StopIteration as e:
break
运行结果:
6. 字符串的替换和修改
re.sub(pattern,repl,string,count=0,flags=0)
re.subn(pattern,repl,string,count=0,flags=0)
repl: 指定用来替换的字符串。
count:最多替换的次数。count=0时替换所有符合条件的字符串。
功能:先找到符合正则表达式的字符串,再替换指定字符串。
re.sub()和re.subn的区别:返回值不同,re.sub()只返回被替换后的字符串。re.subn()返回被替换的字符串和替换次数,为tuple类型。
例如:print(re.sub(r"www","aaa","www.www.baidu. com. www",count=2))
运行结果:aaa.aaa.baidu. com. www
例如:print(re.subn(r"www","aaa","www.www.baidu. com. www",count=2))
运行结果:('aaa.aaa.baidu. com. www', 2)
7. 将字符串分组
使用(),将匹配的字符串分组。在网络爬虫中使用广泛。
例如:
str='010-09993345'
data=re.match(r"(?P(?P\d{3})-(?P\d{8}))",str)
print(data.group(0)) #表示整个字符串
print(data.group(1)) #表示第一个分组,第一个分组是最外面的一个,包含内部的两个。从外到内,从左至右。
print(data.group(2)) #表示第一个子分组
print(data.group(3)) #表示第二个自分组
print(data.group('sub_group2')) #可以使用别名定位分组,别名添加方式"?P"
print(data.groups()) #表示所有的分组
运行结果:
010-09993345
010-09993345
010
09993345
09993345
('010-09993345', '010', '09993345')
8. 编译正则表达式
re.compile()
功能:将正则表达式编译成一个对象,可以调用re.mathc() , re.search() , re.findall() , re.finditer() , re.split() , re.sub() , re.subn()这些函数。
以后不用每次都写正则的条件,只需要用对象调用即可。
例如(少量举例,此处不再赘述):
str="www.www.www.baidu.com.www"
re_data=re.compile("www")
print(re_data.match(str))
print(re_data.search(str))
print(re_data.subn("aaa",str,count=3))
运行结果:
('aaa.aaa.aaa.baidu.com.www', 3)