re模块
re模块是Python中操作正则表达式的内置模块,可以使用正则表达式进行字符串匹配
主要包含以下方法:
re.findall()
re.search()
re.finditer()
re.compile()
re.split()
re.sub()
re.subn()
re.findall()
findall方法会匹配字符串中所有符合规则的项,并返回一个列表,如果没有匹配项,则返回空列表
import re
ret = re.findall(r'\d+', 'saiya06')
print(ret)
输出结果
['06']
re.search()
search会匹配字符串中第一个符合规则的项,并返回一个对象,如果没有则返回None
如果返回一个对象,则可以使用group方法,获取匹配到的项
import re
ret = re.search(r'\d+', 'saiya06')
print(ret)
print(ret.group())
输出结果,能匹配上,可以使用group方法进行取值
<re.Match object; span=(5, 7), match='06'>
06
如果返回为空,则使用group方法会报错
ret = re.search(r'\d+', 'saiya')
print(ret)
print(ret.group())
结果
None
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/EcShop/test/test.py", line 9, in <module>
print(ret.group())
AttributeError: 'NoneType' object has no attribute 'group'
re.match()
match方法会从头匹配字符,如果匹配到符合规则的项,则返回一个对象,用group取值,否则返回None
import re
ret = re.match(r'\d+', '06saiya')
print(ret)
输出结果
<re.Match object; span=(0, 2), match='06'>
如果匹配不上,则返回空
ret = re.match(r'\d+', 'saiya06')
print(ret)
输出结果,由于字符串不是以数字开头,所以没有符合规则的项,返回None
None
re.search()和re.match()基本上是一样的,只不过re.match()是从头开始匹配的,当在正则表达式前面加一个^符号时,两者其实是等价的,即:
re.match(r'\d+', 'saiya06') == re.search(r'^\d+', 'saiya06')
re.finditer()
finditer方法返回一个迭代器,迭代出来的每一项都是一个对象,通过group取值
ret = re.finditer(r'\d+', 'saiya06'*2000000)
for i in ret:
print(i.group())
re.compile()
compile()会预先编译好正则表达式,返回结果可以直接findall、search等方法
p = re.compile(r'\d+')
ret = p.search('saiya06')
print(ret.group())
re.split()
split()会以正则匹配结果,将字符串分割,并返回一个列表
ret = re.split(r'\d+', 'saiya54huang56mou789ren')
print(ret)
输出结果
['saiya', 'huang', 'mou', 'ren']
re.sub()
sub方法可以将匹配到的字符串替换成指定的字符串,可以指定替换多少个
ret = re.sub(r'\d', 'H', 'saiya06')
print(ret)
ret = re.sub(r'\d', 'H', 'saiya06', 1)
print(ret)
输出结果
saiyaHH
saiyaH6
re.subn()
subn方法可以将匹配到的字符串替换成指定的字符串,返回一个元组,元组第二个元素表示替换了多少次
ret = re.subn(r'\d', 'H', 'saiya06')
print(ret)
输出结果
('saiyaHH', 2)
分组方法
在正则表达式中,使用()将指定内容阔起来,就可以通过group方法进行取值
print('>>>>>>>>>>>>不分组>>>>>>>>>>>>>>')
s = '<h1>saiya</h1>'
ret = re.search(r'<\w+>.*?</h1>', s)
print(ret.group())
print('>>>>>>>>>>>>分组>>>>>>>>>>>>>>')
s = '<h1>saiya</h1>'
ret = re.search(r'<(\w+)>(.*?)<(/\w+)>', s)
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))
输出结果
>>>>>>>>>>>>不分组>>>>>>>>>>>>>>
<h1>saiya</h1>
>>>>>>>>>>>>分组>>>>>>>>>>>>>>
h1
saiya
/h1
分组命名,在()中的正则表达式之前,加入?P<>,可以对分组命名,之后group方法可以通过命名取值
s = '<h1>saiya</h1>'
ret = re.search(r'<(?P<tag>\w+)>(.*?)<(/\w+)>', s)
print(ret.group('tag'))
输出结果:
h1
分组命名之后,还可以通过?P=xxx的方式对分组进行引用
s = '<h1>saiya</h1>'
ret = re.search(r'<(?P<tag>\w+)>(.*?)</(?P=tag)>', s)
print(ret)
s = '<h1>saiya</h2>'
ret = re.search(r'<(?P<tag>\w+)>(.*?)</(?P=tag)>', s)
print(ret)
输出结果
<re.Match object; span=(0, 14), match='<h1>saiya</h1>'>
None
浙公网安备 33010602011771号