今日内容:
1.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<\title> """ 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<\title> """ ret = re.search('<(?P<table>.+?)>(?P<content>.+?)<.+',msg) print(ret.group()) # <h1>hahaha<\h1> print(ret.group('table')) # h1 print(ret.group('content')) # hahaha
1.4匹配需要的内容:
msg = r""" # <h1>hahaha<\h1> # <h2>wahaha<\h2> # <title>qqxing<\title> """ # 当遇到不想匹配到的内容,要把不需要和需要的都写出来,用分组把需要的取出 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']