re 模块
import re (要使用模块, 在开头写上)
注意: 永远不要起一个 py 文件的名字, 这个名字和你已知的模块同名!!!!!!!!
查找
.findall: 匹配所有, 每一项都是一个元素
语法: findall(正则表达式, 要判断的字符串)
返回值是一个 列表
- import re
- res = re.findall("\d+","dshfd587sdsf982") #正则表达式, 待匹配的字符串.
- print(res)
- ret = re.findall("\d","dshfd587sdsf982")
- print(ret)
结果:
- ['587', '982']
- ['5', '8', '7', '9', '8', '2']
.search: 只匹配从左到右的第一个, 得到的不是直接的结果, 而是一个变量, 通过这个变量的 group 方法来得到结果,
如果没有匹配到, 会返回 None, 使用 group 会报错.
语法: search(正则表达式, 待匹配字符串)
直接返回是一个内存地址, 通过 group() 返回的是真正的结果
- import re
- ret = re.search("\d+","dshfd587sdsf982")
- print(ret) #内存地址, 正则匹配的结果
- print(ret.group()) #通过 ret.group() 获取真正结果
- ret = re.search('\d+','sjkhk172 按实际花费 928')
- if ret : #内存地址, 这是一个正则匹配的结果, 如果匹配到, 则走 if
- print(ret.group()) #通过 ret.group() 来获取真正的结果
- res = re.search("\d","asdfgvcxzds")
- print(res)
- print(res.group())
结果:
- <_sre.SRE_Match object; span=(5, 8), match='587'>
- 587
- 172
- None
- Traceback (most recent call last):
- File "E:/wanchengdezuoye / 复习 / 复习. py", line 1482, in <module>
- print(res.group())
- AttributeError: 'NoneType' object has no attribute 'group'
.match: 从头开始匹配, 相当于 search 中的正则表达式加上一个 ^
语法: match(正则表达式, 待匹配字符串)
返回的是一个内存地址, 也是要用 group() 返回真正的值
- import re
- ret = re.match('\d+$','172sjkhk 按实际花费 928')
- print(ret) #match 相当于 search 加 ^ , 属于以 xxx 开头, 加上 $ 后, 属于以 xxx 开头, 以 xxx 结尾.
- #而且 ^ 和 $ 默认是整个字符串是否以 xxx 开头, 结尾.
结果:
- None
- import re
- ret = re.match("\d+$","196123456789928")
- print(ret.group())
结果:
196123456789928
字符串处理的扩展: 替换 切割
.split: 切割
- import re
- s = "asdf45fgh89sdcvf23"
- ret = re.split("\d+",s) #以数字为切割符
- print(ret)
结果:
- ['asdf', 'fgh', 'sdcvf', '']
- import re
- s = "asdf45fgh89sdcvf23aaa"
- ret = re.split("\d+",s)
- print(ret)
结果:
['asdf', 'fgh', 'sdcvf', 'aaa']
.sub: 替换,(旧的, 新的, 要替换的字符串, 次数)
- import re
- s = "asd45zxc89wer910rrr"
- ret = re.sub("\d+","A",s) #将字符串 s 中的数字换成 A
- print(ret)
结果:
- asdAzxcAwerArrr
- import re
- s = "asd45zxc89wer910rrr"
- ret = re.sub("\d+","A",s,1) #将字符串中的数字换成 A, 要替换的次数为 1 次
- print(ret)
结果:
asdAzxc89wer910rrr
.subn: 返回一个元组, 第二个元素师替换的次数
- import re
- s = "asd45zxc89wer910rrr"
- ret = re.subn("\d+","A",s)
- print(ret)
结果:
('asdAzxcAwerArrr', 3)
re 模块的进阶: 时间 / 空间的节省
.compile: 节省你使用正则表达式解决问题的时间
将正则表达式 编译成 字节码 , 在下面的多次使用中 不用多次编译了
语法: compile(正则表达式)
返回的是编译后的正则表达式的内存地址
- import re
- s = re.compile("\d+") #已经编译完了
- print(s)
- ret = s.findall("asdf45fgh89sdcvf23aaa")
- print(ret)
- res = s.search("asdf45fgh89sdcvf23aaa")
- print(res.group())
结果:
- re.compile('\\d+')
- ['45', '89', '23']
- 45
.finditer: 节省你使用正则表达式解决问题的空间 / 内存
语法: finditer(正则表达式, 待匹配字符串)
返回的是一个可迭代对象的内存地址, 可以循环之后用 group() 得到真正的结果
- s = re.finditer("\d+","asd45zxc89wer910rrr")
- for i in s:
- print(i.group())
结果:
45
89
910
******* 分组在 re 模块中的使用:
格式: 优先级对 findall() 使用, 如果正则表达式中有分组, (? : 正则表达式) 取消优先级
分组对 search 序列标号提取要匹配的, 或者对该分组命名 格式 (? p <name>)
同时对 html 格式提取, "<(?P<count>\w+)>(\w+)</(?P=count)>" 前面和后面的判断必须一样
- import re
- s = '<a>wahaha</a>' # 标签语言 html 网页
- ret = re.search(">(\w*)<",s) #为了 findall 也可以顺利取到分组中的内容, 有个特殊语法, 也就是优先显示分组中的内容 print(ret.group(1))
- ret = re.findall(">(\w*)<",s) # 优先级
- print(ret)
- s1 = "515.64123165"
- ret2 = re.findall("\d+(?:.\d+)?",s1) # 取消优先级
- print(ret2)
结果:
- wahaha
- ['wahaha']
- ['515.64123165']
- import re
- s = "<a>wahaha</a>" #标签语言 html= re.search("<(\w+)>(\w+)</(\w+)>",s) #可以根据分组的位置标号提取
- print(ret1.group()) #所有的结果
- print(ret1.group(1)) print(ret1.group(2))
- print(ret1.group(3))
- <a>wahaha</a>
- a
- wahaha
- a
- import re
- s = '<a>wahaha</a>'
- ret1 = re.search("<(?P<con>\w+)>(?P<con1>\w+)</(?P<con2>\w+)>",s) # 可以根据分组的名字提取
- print(ret1.group())
- print(ret1.group('con'))
- print(ret1.group('con1'))
- print(ret1.group('con2'))
结果:
- <a>wahaha</a>
- a
- wahaha
- a
- s = '<a>wahaha</a>'
- ret6 = re.search("<(?P<conu>\w+)>(\w+)</(?P=conu)>",s) #要求使用这个名字的分组和前面同名分组中的内容匹配必须一致
- print(ret6.group())
结果:
<a>wahaha</a>
来源: http://www.bubuko.com/infodetail-2732292.html