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
posted @ 2022-12-03 00:12  saiya6  阅读(135)  评论(0)    收藏  举报