re模块下的常用方法
要使用re模块,就要先导入re模块
import re
导入之后就可以使用re模块中的方法了
re.findall和re.finditer
re.findall接收表达式和字符串,返回所有满足匹配条件的结果放在列表里
re.finditer同re.findall,不过re.fanditer将返回一个包含匹配信息的对象放在一个迭代器中。调用group()方法可以得到匹配的字符串
ret =re.findall("a","an apple") print(ret) #['a', 'a'] ret1 = re.finditer("a","an apple") for i in ret1: print(i) #<_sre.SRE_Match object; span=(0, 1), match='a'> #<_sre.SRE_Match object; span=(3, 4), match='a'> ret2 = re.finditer("a","an apple") for i in ret2: print(i.group()) #a #a
findall的优先级查询
import re print(re.findall('(abc)+','abcabcabc')) print(re.findall('(?:abc)+','abcabcabc')) print(re.findall('abc+','abcabcabc'))
re.search和re.match
re.search函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
re.match同search,不过他是在字符串开始处进行匹配
ret =re.search("a","an apple") print(ret) #<_sre.SRE_Match object; span=(0, 1), match='a'> print(ret.group()) #a ret1=re.match("a","mea") print(ret1) #None ret2=re.match("a","and") print(ret2.group()) #a
re.split接受一个表达式和一个字符串,用匹配到的字符或字符组中的每一个元素去分割字符串,得到一个列表,也可以传递参数,选择分割次数
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd']
split的优先级
ret=re.split("\d","ef2sf3esq1w21") print(ret) #['ef', 'sf', 'esq', 'w', '', ''] ret1=re.split("(\d)","ef2sf3esq1w21") print(ret1) #['ef', '2', 'sf', '3', 'esq', '1', 'w', '2', '', '1', '']#依次切,切出来空格 #在匹配部分加上()之后所切出得结果是不同的, #没有()的没有保留用来切割的元素,但是有()的能用来切割的元素 #这个在某些需要保留匹配部分的使用过程是十分重要的
re.sub和re.subn
都是替换
ret=re.sub("\d","h","1g23g4g5g6",1) #前面是一个正则表达式,替换正则表达式匹配到的内容,后面的数字是替换次数,不写全部替换 print(ret) #hg23g4g5g6 ret1=re.sub("[23]","h","1g23g4g5g6",1) #替换字符组中的字符,这里只替换了一次 print(ret1) #1gh3g4g5g6 ret2=re.subn("\d","h","1g23g4g5g6",1) #用法和sub相同,不过返回一个元祖,元组中还包括替换的次数 print(ret) #('hg23g4g5g6', 1)
re.compile
编译,将正则表达式编译成为一个正则表达式对象,再去调用search(),参数为待匹配的字符串
得到一个包含匹配信息的对象
obj=re.compile("\d{3}") ret = obj.search("123sad124") print(ret.group()) #123 匹配到了第一个 obj=re.compile("\d{3}") ret = obj.findall("123sad124") print(ret) #['123', '124'] 得到了一个含有匹配到内容的列表
匹配标签
前后组内的内容是完全一致的才能够匹配
ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>") #可以在分组中利用?P<name>的形式给分组起名字 #获取的匹配结果可以直接用group("name")的形式拿到对应的值 print(ret.group("name"))#h1 print(ret.group())#<h1>hello</h1> ret1=re.search(r"<(\w+)>\w+</\1>","<h1>hello<h1>") #如果不给组起名字,也可以用\序号来找到对应的组,表示要找到的内容和前面组的内容一致 #获取的匹配结果可以直接用group(序号)拿到对应的值 print(ret.group(1))#h1 print(ret.group())#<h1>hello</h1>