python得re模块

1. re模块使用格式

import re   # 导入模块

查找,验证:

re.search(rule,string)    # 如果没有匹配结果返回None,如果有结果返回一个结果集,用.group()获取结果, .span()获取内容索引位置,特点是找到即返回

re.findall(rule,string)     # 如果没有匹配结果返回一个空列表,如果有结果返回一个列表存放所有匹配到的内容

re.match()    # 只是规则前加了^,用search可以替代

替换,切割:

re.sub(rule,repl,string,count=0)    # 替换string里匹配到的内容,默认全部替换,可以指定替换次数,返回一个字符串

re.subn(rule,repl,string,count=0)   # 替换string里匹配到的内容,默认全部替换,可指定次数,返回一个元祖,第一位为替换后的字符串,第二位为替换次数

re.split(rule,string,maxsplit=0)   # 以规则切割string,可指定切割次数,如果没有匹配到内容返回一个内容的列表

提前定制规则:

场合:用在需要重复用到同一个规则时候,提前编译可以节省时间,提高效率

rule = re.compile(rule)  # 提前编译

rule.search(string)   # 使用提前编译的规则进行search

匹配到内容生成一个迭代器:

场合:在提取到大量数据时候,不会担心内存溢出,节省内存空间

finditer(rule,string)   # 得到的是一个结果集,需要.group()取值,.span()取索引范围

1.2使用分组:

findall():

注: findall()默认加分组会优先提取括号内的内容

import re
msg = r"""
# <h1>hahaha<h1>
# <h2>wahaha<h2>
# <title>qqxing<	itle>
"""
ret = re.findall('>.+<',msg)   
print(ret)
# ['>hahaha<', '>wahaha<', '>qqxing<']
print([i.strip('<>') for i in ret])  # 不加分组需要手动过滤一遍
# ['hahaha', 'wahaha', 'qqxing']

# 加分组更好用
ret = re.findall('>(.+)<',msg)  # findall在加上分组后会优先提取括号的内容
print(ret)
# ['hahaha', 'wahaha', 'qqxing']

取消分组:   (?: )

ret = re.findall('>(?:.+)<',msg)

search() :

# 不会受到分组影响

split():

# 使用分组会保留分组的内容

ret = re.split('(d+)','a123b456c678')
print(ret)
# ['a', '123', 'b', '456', 'c', '678', '']

1.3分组命名

可以很方便取到分组的内容。

格式:(?P<变量名>)

msg = r"""
# <h1>hahaha<h1>
# <h2>wahaha<h2>
# <title>qqxing<	itle>
"""
ret = re.search('<(?P<table>.+?)>(?P<content>.+?)<.+',msg)
print(ret.group()) # <h1>hahaha<h1>
print(ret.group('table'))  # h1
print(ret.group('content'))  # hahaha

 group(1),group(2)取第一二分组内容:

import re
a = 'abc123efg456'
ret = re.search('(?P<a>d+)(?P<b>w+)',a)
print(ret.group(1))  # 123
print(ret.group(2))  # efg456

1.4匹配需要的内容:

msg = r"""
# <h1>hahaha<h1>
# <h2>wahaha<h2>
# <title>qqxing<	itle>
"""
# 当遇到不想匹配到的内容,要把不需要和需要的都写出来,用分组把需要的取出
ret = re.findall(r'<(.+?)>.+?<\.+>',msg)
print(ret)
# ['h1', 'h2', 'title']

a = '1-2*(60+(-40.35/5)-(-4*3))'
ret = re.findall('d+.d+|(d+)',a)
ret.remove('')
print(ret)
# ['1', '2', '60', '5', '4', '3']

1.5特殊需求

msg = r"""
<h1>hahaha<h1>
<h2>wahaha<h2>
<title>qqxing<	itle>
"""
# 定义名称,相等匹配
rule = '<(?P<table>).*>.*<(?P=table).*>'
ret = re.search(rule,msg)
if ret:
    print(ret.group())   # <h1>hahaha<h1>
# 1匹配前个括号内容
rule = r'<(.*)>.*<\1>'
ret = re.search(rule,msg)
if ret:
    print(ret.group())   # <h1>hahaha<h1>

1.6 sub替换全部内容,复用括号里的内容

 // 表示sub正则匹配出来得内容(括号里的),通过g<1>可以复用

原文地址:https://www.cnblogs.com/zezhou/p/10578732.html