re模块下的常用方法
findall
是把能匹配到的所有放到一个列表里面放到内存中,一执行就能拿到结果
例子在上一篇博客里
search
函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个对象
通过调用group()方法得到匹配的字符串
例:
# search
print(re.search("(?P<name>[a-z]+)","alex36wusir34sdfahk33"))
print(re.search("(?P<name>[a-z]+)","alex36wusir34sdfahk33").group())
print(re.search("(?P<name>[a-z]+)\d+","alex36wusir34sdfahk33"))
print((re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34sdfahk33")).group("name"))
print((re.search("(?P<name>[a-z]+)(?P<age>\d+)","alex36wusir34sdfahk33")).group("age"))
结果:
<_sre.SRE_Match object; span=(0, 4), match='alex'>
alex
<_sre.SRE_Match object; span=(0, 6), match='alex36'>
alex
36
match
和search差不多,不过只在字符串开始处进行匹配
split
分割
例:
#split
print(re.split(" ","hello abc def"))
print(re.split("[ |]","hello abc|def"))
print(re.split("[ab]","asdabcd"))#[]是按里面的a或b,所以分的时候按a分,再把剩下的按b分一次
print(re.split("[ab]","abc"))#注意按a分时,第一个为a它左边为空右边为bc,再按b分bc作为空右为c
结果:
['hello', 'abc', 'def']
['hello', 'abc', 'def']
['', 'sd', '', 'cd']
['', '', 'c']
sub
# sub 首先得有个字符串,想把字符串中的数字替换成别的 所以得先在字符串中找到数字,然后用什么替换
print(re.sub("\d","A","jaskdfas21443dfjk325"))
print(re.sub("\d","A","jaskdfas21443dfjk325",4))
print(re.subn("\d","A","jaskdfas21443dfjk325"))
结果:
jaskdfasAAAAAdfjkAAA
jaskdfasAAAA3dfjk325
('jaskdfasAAAAAdfjkAAA', 8)
compile
#compile 如果只是一次,那么和re.findall()是一样的。但是多次的话,效率上就可以看出不同了
#后者需要对规则编译好多次,而compile只需对规则编译一次
com = re.compile("\d+")
print(com.findall("afsd1323asd23767"))
结果:
['1323', '23767']
finditer
是把能匹配到的所有封装到一个迭代器里面(当处理的比较多的时候,它把东西放到迭代器中,用一条处理一条)
#finditer
ret = re.finditer("\d","dsafg31j123")
print(ret)
print(next(ret).group())
print(next(ret).group())
结果:
<callable_iterator object at 0x00000094EF188F28>
3
1
补充:
#这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall("www\.(baidu|163)\.com","afdddfwww.baidu.com")
print(ret)
ret1 = re.findall("www\.(?:baidu|163)\.com","afdddfwww.baidu.com")
print(ret1)
结果:
['baidu']
['www.baidu.com']