Python之re模块
-
re模块介绍
- re 模块使 Python 语言拥有全部的正则表达式功能。
-
re模块的内置方法
-
re.findall()
:对字符串进行正则表达式的全文匹配,把所有符合正则表达式的结果以列表的形式返回,如果正则表达式中有分组,虽然匹配的时候按照正则表达式进行匹配的,但是只返回分组中的正则内容。
import requests s = '<h1>Python之re模块findall方法</h1>' # 通过正则只取出结果:'Python之re模块findall方法' ret = re.findall('<h1>(.*?)</h1>',s) # 有分组()时,返回结果只会显示分组内容 print(ret) # ['Python之re模块findall方法']
-
re.search()
:对字符串进行正则表达式的全文匹配,只取第一个符合正则表达式条件的结果,得到的结果是一个变量,通过
.group(n)
可以获取到第n个分组中匹配到的内容。主要用来寻找字符串中是否含有满足条件的子内容。import requests s = '4-2*(4+6)' # 通过正则计算s中4+6的值 ret = re.search('(\d+)[+](\d+)',s) ret_1 = int(ret.group(1)) ret_2 = int(ret.group(2)) print(ret_1 + ret_2)
-
re.split()
:以正则表达式为条件,切分字符串内容,并将内容以列表的形式返回。若正则表达式中有分组,则保留匹配的切分条件。
# 不含分组 import re s = '54Python432re78split' ret = re.split('\d+',s) print(ret, type(ret)) # ['', 'Python', 're', 'split'] <class 'list'> # 含有分组 import re s = '54Python432re78split' ret = re.split('(\d+)',s) print(ret, type(ret)) # ['', '54', 'Python', '432', 're', '78', 'split'] <class 'list'>
-
re.sub()
:以正则表达式为条件,用指定的字符串替换符合正则表达式内容的字符串,并且可以指定替换的次数。
# 不指定替换次数,默认全部替换 import re s = 'Python432re78sub' ret = re.sub('\d+', '_', s) print(ret, type(ret)) # Python_re_sub <class 'str'> # 指定替换次数 import re s = 'Python432re78sub' ret = re.sub('\d+', '_', s, 1) # 指定替换次数1 print(ret, type(ret)) # Python_re78sub <class 'str'>
-
re.subn()
:以正则表达式为条件,用指定的字符串替换符合正则表达式内容的字符串,并且统计出替换的次数,并以元组的形式返回结果。
import re s = 'Python432re78sub' ret = re.subn('\d+', '_', s) print(ret, type(ret)) # ('Python_re_sub', 2) <class 'tuple'>
-
re.math()
:从开头进行匹配,相当于添加了
^
,使用方法同search()
。一般用来规定用户输入信息必须是什么样的。import re while 1: user_input = input('请输入您的手机号:').strip() # 要求用户输入的手机好必须是第一位是1开头,第二位是3到9的11位数字 ret = re.match('1[3-9]\d{9}', user_input) if re.match('1[3-9]\d{9}', user_input) == None: print('请输入合法的手机号') else: break
-
re.compile()
:可以将正则表达式一次编译多次使用,避免重复编译正则表达式。是一个提升代码执行效率的工具。
import requests s_1 = '<h1>page1</h1>' s_2 = '<h1>page2</h1>' s_3 = '<h1>page3</h1>' ret = re.compile('<h1>(.*?)</h1>') res_1 = ret.findall(s_1) res_2 = ret.findall(s_2) res_3 = ret.findall(s_3) print(res_1) print(res_2) print(res_3)
-
re.finditer()
:不同于
re.findall()
直接返回一个列表,re.finditer()
返回的是一个迭代器,通过迭代器一个一个的取值,可以节省内存空间。import requests s = '477h314kh3h532kjh589kjh523h5kj2h3jh6957kj4h6kj' ret = re.finditer('\d+',s) for i in ret: print(i.group())
在爬虫中
re.compile()
经常与re.finditer()
连用。即能节省时间,也能节省空间。 -
-
re模块的使用
-
分组命名
当正则表达式中存在很多个分组,为避免对分组取值时一个一个的去数分组的情况发生,一般都会给分组进行命名,命名的方法实在括号内的最前面添加
(?P<分组的名称>)
。import requests s = '477h314kh3h532kjh589' ret = re.search('(?P<取数字>\d+)(?P<取字母>\w+?)',s) print(ret.group('取数字')) # 477 print(ret.group('取字母')) # h
-
分组的引用
当正则表达式中的两个分组内容相同,可以通过分组名称进行分组内容的引用,注意,通过分组名称引用的并不是正则表达式,而是正则表达式匹配的内容。
import re s = '<h1>Python之re模块findall方法</h1>' ret = re.search('<(?P<tag>\w+)>(.*?)</(?P=tag)>',s) print(ret) # 正则表达式中的\1表示第一个分组,因此也可以写成 import re s = '<h1>Python之re模块findall方法</h1>' ret = re.search(r'<(?P<tag>\w+)>(.*?)</\1>',s) print(ret)
-