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>

  

posted @ 2017-11-13 22:42  瓜田月夜  阅读(219)  评论(0编辑  收藏  举报