正则表达式&re模块
正则表达式:
功能:字符串模糊匹配查询
元字符:. ,^, $, *, +, ?, {}, [ ],| ( ),\
- . 通配符点:匹配除换行符以外的任意一个符号
- ^:只匹配字符串的开始位置
- $:只匹配字符串的末尾位置
- *: 重复(0,+∞)
- +:重复 [1,+∞)
- ?:重复 [0,1]
- {}:重复指定次数{m,n}
\:转义符
转义符跟元字符,元字符变普通符号
转义符加普通符号,有特殊含义
- \d 0-9任意数字
- \D 非数字
- \w 任意字母数字 [azAZ0-9-]
- \W 非数字字母
- \s 空格
- \b 匹配特色字符边界,比如空格,&,#等
\b在assic码里是响铃符
>>> re.findall(r'c\\l','abc\le') ['c\\l'] >>> re.findall('c\\\\l','abc\le') ['c\\l'] >>> re.findall('c\\\l','abc\le') ['c\\l'] >>>
[ ]字符集:多选一,“或”
字符集中只有三个特殊符号: - ^ \
- - :表示范围
- ^:取反
- \:转义符依然有效
管道符:| 或
re.findall('-?\d+\.?\d*','234,-45,8.9,-7.9,6')
贪婪匹配:按规则尽可能多多匹配内容
>>> import re >>> res=re.findall('abc+','abcccccdvd') >>> print(res) ['abccccc']
非贪婪模式:在规则后加’?’ 切换成非贪婪模式,在该模式下,按着最小重复数匹配
s="<div>yuan<img></div><a href=""></div>"
#
# ret=re.findall("<div>.*?</div>",s) # <div>yuan<img></div><a href=></div>
# print(ret)
# ret=re.search("<div>.*?</div>",s) # <div>yuan<img></div><a href=></div>
# print(ret)
几个常用的非贪婪匹配Pattern
*? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复
.*?的用法:
-------------------------------- . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式。 何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在: .*?a 就是取前面任意长度的字符,到底一个 a 出现
Re模块
():
分组
分组后查找后只显示分组里的内容
显示全部的内容在分组括号里加上’?:’
有名分组:
res=re.search('(?P<year>20\d{2})-(?P<mouth>[01]\d)','2014-08') >>> res.group('year') '2014' >>> res.group('mouth') '08'
re.findall(pattern, str,flag)
===>结果是个列表
===>优先筛选(分组的情况)
Re.search(pattern, str,flag)
==>只匹配第一个符合条件
==>匹配成功,返回对象。匹配失败,返回None
Re.match(pattern, str,flag)
==>只从开始位置匹配符合条件
==>匹配成功,返回对象。匹配失败,返回None
re.split(pattern,str,max)
Max:最大分割次数
re.compile(pattern,flag)编译 返回一个可调用的对象
obj=re.compile("\d+") ret=obj.findall("akhsd4325asdk43") # re.findall("\d+","") print(ret)
Re.finditer( ) 返回迭代器对象
# ret=re.finditer("\d+","dasfjk324khk4234kj234hkj234hkj234kj234k2j34hk2j3h4") # print(ret) # # print(next(ret).group())