python re 模块

import   re 

1.常用方法:

findall   ⭐

import re
ret = re.findall("\d+","s1da48e5d1fw8e4f") #第一个参数为正则,第二个参数为待匹配字符串
print(ret)  #返回值:列表格式返回一个值,内容为所有匹配上的项

search  

import re
ret = re.search("\d+","s1da48e5d1fw8e4f") #返回值类型为正则匹配结果的对象,返回一个值,
print(ret)  #匹配上就返回对象
print(ret.group()) #返回的对象通过group()来获取匹配到的第一个结果

match  

import re 
ret = re.match('\d+','19874ashfk01248')
print(ret)
#结果 <_sre.SRE_Match object; span=(0, 5), match='19874'>
#match方法在正则匹配之前一藏了一个^("^\d+"),所以总是默认从第一位开始匹配,第一位匹配不上就是None ret1
= re.match('\d+','%^19874ashfk01248') print(ret1)
#结果 None

替换(相当于replace)

sub  

import re
print("a1s2ad3fa3g".replace("a","A",3))
ret =re.sub("\d+","A","a1s2ad3fa3g") #把数字都替换成大写的 A
print(ret)
#结果 A1s2Ad3fA3g
ret1 =re.sub("\d+","A","a12s23ad43fa35g",1) #最后一个参数表示替换几次,1就是只替换第一个
print(ret1)
# 结果 aAs23ad34fa35g

subn  

import re 
ret = re.subn('\d+','H','replace789nbc2xcz392zx')
print(ret)   #返回值为元组,第一个为匹配后结果,第二个参数为替换的次数
#结果 #('replaceHnbcHxczHzx', 3)

split  

import re
ret = re.split("\d+","a10b20c30d40")
print(ret)
#结果  ['a', 'b', 'c', 'd', '']

2.进阶方法 - 爬虫\自动化开发

compile  ⭐  (时间效率)

import re
ret = re.compile("-0\.\d+|-[1-9]\d+(\.\d+)?")
#利用compile方法提前准备好一个匹配规则
obj = ret.search("alex83egon-20taibai-40")
#需要的时候直接调用,ret.方法,里面参数传待匹配字符串
print(obj.group())

此方法节省时间,只有在多次使用某一个相同规则表达式的时候,compile才会帮助我们提高效率

 

finditer   ⭐ (空间效率)

import re
ret = re.finditer("\d+","df154dsfwe8f4d5x21wfe4")
print(ret)
#结果 <callable_iterator object at 0x000001CAFFB4C080>
#拿到一个迭代器
for i in ret :
    print(i.group())
#循环拿出每一个元素

findall是一次把所有匹配的元素全部拿出来,如果是很大的文件会很占内存,这是利用finditer,需要一个拿一个,节省内存空间

 

匹配的优先级  ⭐

1. findall()优先级

import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']

 

 

2.split()优先级

ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

3.search()

import re
ret = re.search('\d+(.\d+)(.\d+)(.\d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))')
print(ret.group())
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))

 

分组命名

(?P<name>)==>(?P=name)

<\w+>\w+</\1>

import re


ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name'))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>

ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1))
print(ret.group())  #结果 :<h1>hello</h1>

 

 

 

 

posted @ 2018-08-07 20:24  北寒-  阅读(149)  评论(0编辑  收藏  举报