模块-re模块

re模块

常用方法

findall

findall(正则,待匹配字符串) :会匹配字符串中所有符合规则的项并返回一个列表,如果没有匹配到返回一个空列表

ret = re.findall('\d+','alex83')

注意点

  1. findall 中正则里面有分组,那么只保留分组中的内容
ret = re.findall('\d(\d)','aa1alex83')
# findall遇到正则表达式中的分组,会优先显示分组中的内容
print(ret)
  1. (?:)取消只保留分组中的内容的含义(取消分组优先)
ret = re.findall('\d+(?:\.\d+)?','1.234+2')
print(ret)

search(正则,待匹配字符串) :会从头到尾从带匹配匹配字符串中取出第一个符合条件的项,后面即使有也不再继续

  • 如果匹配到了,返回一个对象,用group取值
  • 如果没匹配到,返回None,不能用group
ret = re.search('\d+','alex83')
print(ret)  # 如果能匹配上返回一个对象,如果不能匹配上返回None
if ret:
    print(ret.group()) 

match

match(正则,待匹配字符串) :会从头开始匹配,从字符串中取出从第一个字符开始判断是否符合规则,若第一个字符就不符合规则,那么就停止并返回None

ret = re.match('\d','alex83') 
相当于== re.search('^\d','alex83')
  • match = search + ^正则

进阶方法

finditer

finditer(正则,待匹配字符串) :字符串很长,匹配的结果很多的时候使用

  • 返回的是一个迭代器,迭代出来的每一项都是一个对象,然后通过group取值即可
ret = re.findall('\d','safhl02urhefy023908'*20000000)
print(ret)# 一次性匹配出结果,影响效率

ret = re.finditer('\d','safhl02urhefy023908'*20000000)  # ret是迭代器
for i in ret:    # 迭代出来的每一项都是一个对象
    print(i.group())  # 通过group取值即可

compile

compile(正则) :先将正则编译好,再对编译好的结果进行以上的匹配方法

ret = re.compile('\d3')
ret.search/ret.findall/ret.match/ret.finditer

r1 = ret.search('alex83')
print(r1)

r2 = ret.findall('wusir74')
print(r2)

r3 = ret.finditer('taibai40')
for i in r3:
    print(i.group())

不常用方法

sub

替换 sub(正则,替换内容,字符串,替换个数) 可以规定替换几个

ret = re.sub('\d','D','alex83wusir74taibai',1)
print(ret)

subn

将内容替换并且保存,返回一个元组:(替换的结果,替换了多少次)

ret = re.subn('\d','D','alex83wusir74taibai')
print(ret)

split

切割 split(正则,待匹配) 将符合正则规则的内容作为切割符,如果正则中没有分组,则默认不保留切割符

import re
ret = re.split('\d(\d)','alex83wusir74taibai')  # 默认自动保留分组中的内容
print(ret)

注意点:re中不管什么方法,会自动保存分组中的内容

group索引取值

索引0的位置为整个正则匹配的结果,要取分组中的内容要从1开始

ret = re.search('<(\w+)>(.*?)</\w+>',s1)
print(ret)
print(ret.group(0))   # group参数默认为0 表示取整个正则匹配的结果
print(ret.group(1))   # 取第一个分组中的内容
print(ret.group(2))   # 取第二个分组中的内容

分组命名

  • 格式:(?P<名字>正则)

    ret = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1)
    print(ret)
    print(ret.group('tag'))   # 取tag分组中的内容
    print(ret.group('cont'))   # 取cont分组中的内容
    

引用分组

  • 格式:(?P=组名)

    作用:这个组中的内容必须完全和之前已经存在的分组中匹配到的内容一模一样

# 引用分组
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1)
print(ret.group('tag'))

# 不使用组名,直接使用 \ + 索引值
s1 = '<h1>wahaha</h1>'
s2 = '<a>wahaha ya wahaha</a>'
ret = re.search(r'<(\w+)>.*?</\1>',s1)
print(ret.group(1))
posted @ 2020-06-06 17:41  Hedger_Lee  阅读(161)  评论(0编辑  收藏  举报