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)