import re
一、re模块方法
查找:
1.re.findall():
匹配所有 (输出结果为列表) #所查找对象中的每一项都是列表中的一个元素
re.findall(a,b,#c) 其中三个参数,一个默认值,两个必填
a 为正则表达式 b 为待匹配字符串 c 为flag
例子:
re.findall('\d+','sdasdf12asdad1515') ['12', '1515']
re.findall('\d','sdasdf12asdad1515') ['1', '2', '1', '5', '1', '5']
2.re.search():
只匹配从左到右第一个,得到的不是直接结果,而是一个变量,变量通过group方法获得
例子:
ret = re.search('\d+','sdasdf12asdad1515')
print(ret) #返回是内存地址,一个正则匹配的结果
print(ret.group()) #通过ret.group()获取真正结果
3.re.match()
从头开始匹配,相当于searc的正则表达式前中加一个^
例子:
ret = re.match('\d+','sdasdf12asdad1515')
#等同于ret = re.search('^\d+','sdasdf12asdad1515')
字符串处理的扩展:替换 切割
1.re.split() 替换
按照正则规则进行切割
例子:
s = 'ada|aasd|asfa|'
print(s.split('|')) 按照'|'进行切割
s = 'wanli212tangm122baocai25'
ret = re.split('\d+',s) 按照正则规则'\d+'(数字)切割
print(ret)
2.re.sub() 替换
按照正则规则进行替换 (谁,旧的,新的,替换次数)#参数
例子:
ret = re.sub("\d+",'H','wanli212tangm122baocai25',2) 用H替换s中的数字
3.re.subn()
一样,返回值有两个,组成元组,第二个为替换次数
re模块的进阶:时间与空间
1.re.compile() 省时间
编译一个正则表达式,用这个结果去search,match,finditer。。。节省时间(效率)
例子:
a = re.compile('\d+')
ret1 = re.findall('wanli212tangm122baocai25')
ret2 = re.search('wanli212tangm122baocai25')
ret3 = re.finditer('wanli212tangm122baocai25')
print(ret1,ret2,ret3) 意思就是不用每次再re.findall的参数中写正则表达式了
2.re.finditer() 省空间
返回一个迭代器,所有结果都在这个迭代其中,通过循环+group的形式取值
例子:
ret = re.finditer('\d+','wanli212tangm122baocai25')
for i in ret:
print(i.group()) 意思就是把找到结果的生成迭代器,为省内存
二、在python中使用正则表达式的特点与问题
分组问题:
标签语言 '<a>.....</a>' 固定格式
import re
search #分组取
s = '<a>wahaha</a>'
ret = re.search("<(\w+)>(wahaha)</(\w+)>")
print(ret.group()) 0为整个字符串
print(ret.group(1))
print(ret.group(2))
print(ret.group(3))
findall #优先显示
为了findall 也可以顺利取到分组中的内容,有一个特殊的语法,优先显示分组中的内容
ret = re.finditer(">(wahaha)<",s) 取消分组优先(?:正则表达式)
print(ret)
spilt #显示切割部分
ret = re.spilt('\d+',"aaaa11aaa22asd15asda2151asda")
ret = re.spilt('(\d+)',"aaaa11aaa22asd15asda2151asda") 把数字也保留了下来
分组命名 (?P<这个组的名字>正则表达式)
三.使用正则表达式的技巧
思路: 有时要取一个值,可以取出全部,然后优先显示,来排除非要取的值
例如:
a = '11aaa22asd15asda2151asda4.6asfaf8.7'
需求: 匹配所有整数
ret = re.findall('\d+)\.\d+|\d+',a)
print(ret)
ret.remove('')
print(ret)