re:模块
Posted jiaqi-666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re:模块相关的知识,希望对你有一定的参考价值。
模块的引用
import re
注:为.py文件取名时不能与模块的名字相同
re模块中的查找
findall
匹配所有条件相匹配,每一项都是列表中的元素
import re ret = re.findall(r"d+", "大123家78好!") print(ret) 运行结果: [‘123‘, ‘78‘]
search
匹配从左到右的第一个结果,得到的是一个变量,通过这个变量的group()方法来获结果
ret = re.search(r"d+", "大123家78好!") print(ret) print(ret.group()) 运行结果: <_sre.SRE_Match object; span=(1, 4), match=‘123‘> 123
需要注意的是若是没有匹配结果,就会报错,因此常用if做判断,再进行打印
ret = re.search(r"d+", "大123家78好!") if ret: print(ret.group())
match
从头开始匹配,相当于search的正则表达式的开头加入 ^ 规则
ret = re.match(r"d+", "大123家78好!") print(ret) ret = re.match(r"d+", "123家78好!") print(ret) print(ret.group()) 运行结果: None <_sre.SRE_Match object; span=(0, 3), match=‘123‘> 123
re模块中的切割与替换
split
与字符串的切割类似,切割条件去除,且以切割条件结尾的话会,结果中会出现一个空(" ")
ret = re.split(r"d+", "大123家78好!") print(ret) ret = re.split(r"d+", "大123家78好!9") print(ret) 运行结果: [‘大‘, ‘家‘, ‘好!‘] [‘大‘, ‘家‘, ‘好!‘, ‘‘]
sub与subn
sub("正则a","b","内容",n)
subn("正则a","b","内容")
sub与subn几乎相同,只是subn可以现出替换的次数,
用法是:将规则a的匹配内容换成b,n是想要替换的次数
ret = re.sub(r"d+", "!", "大123家78好") print(ret) ret = re.subn(r"d+", "!", "大123家78好") print(ret) ret = re.sub(r"d+", "!", "大123家78好", 1) print(ret) 运行结果: 大!家!好 (‘大!家!好‘, 2) 大!家78好
compile节省时间
compile可以节省使用正则表达式解决问题的时间,她是将正则表达式编译成字节码,这样在多次使用时就不需要多次编译了.
ret = re.compile(r"d+") print(ret) print(ret.findall("大123家78好!")) print(ret.search("大123家78好!").group()) 运行结果: re.compile(‘\d+‘) [‘123‘, ‘78‘] 123
finditer节省空间
可以节省使用正则表达式时所占用的内存
finditer返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值因此能够节省内存
ret = re.finditer(r"d+", "大123家78好!") print(ret) for i in ret: print(i.group()) 运行结果: <callable_iterator object at 0x000000000256EFD0> 123 78
分组在re模块中的应用
findall分组
findall为了可以顺利取到分组中的内容,有一个特殊的语法,就是优先显示分组中的内容
s = ‘<a>wahaha</a>‘ ret = re.findall(r">w+<", s) print(ret) ret = re.findall(r">(w+)<", s) print(ret) 运行结果: [‘>wahaha<‘] [‘wahaha‘]
?:正则表达式可以取消分组优先
ret = re.findall(r"d(.d+)?", "1.23*4") print(ret) ret = re.findall(r"d(?:.d+)?", "1.23*4") print(ret) 运行结果: [‘.23‘, ‘‘] [‘1.23‘, ‘4‘]
search分组
group()中数字参数代表的是取对应分组中的内容,不加参数默认为0代表的是全部匹配的内容
s = ‘<a>wahaha</a>‘ set = re.search(r"<(w+)>"r"(w+)"r"</(w+)>", s) print(set.group()) print(set.group(0)) print(set.group(1)) print(set.group(2)) print(set.group(3)) 运行结果: <a>wahaha</a> <a>wahaha</a> a wahaha a
split分组
split应用分组时会保留切割条件
ret = re.split(‘d+‘, ‘alex83taibai40egon25aa‘) print(ret) ret = re.split(‘(d+)‘, ‘alex83taibai40egon25aa‘) print(ret) 运行结果: [‘alex‘, ‘taibai‘, ‘egon‘, ‘aa‘] [‘alex‘, ‘83‘, ‘taibai‘, ‘40‘, ‘egon‘, ‘25‘, ‘aa‘]
分组命名
?P<这个组的名字>正则表达式
s = ‘<a>wahaha</a>‘ ret = re.search(‘>(?P<con>w+)<‘, s) print(ret.group(1)) print(ret.group(‘con‘)) 运行结果: wahaha wahaha
判断标签的头尾是否一致
s = ‘<a>wahaha</a>‘ pattern = ‘<(w+)>(w+)</(w+)>‘ ret = re.search(pattern, s) print(ret.group(1) == ret.group(3)) # 使用前面的分组 要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致 pattern_new = ‘<(?P<tab>w+)>(w+)</(?P=tab)>‘ ret = re.search(pattern_new, s) print(ret) 运行结果: True <_sre.SRE_Match object; span=(0, 13), match=‘<a>wahaha</a>‘>
当所取的内容没有太大的区分特点时容易和你不想匹配的内容混在一起,可以使用分组的优先取值
ret = re.findall(r"d+", "1-2*(60+(-40.35/5)-(-4*3))") print(ret) ret = re.findall(r"d+.d+|(d+)", "1-2*(60+(-40.35/5)-(-4*3))") ret.remove(‘‘) print(ret) 运行结果: [‘1‘, ‘2‘, ‘60‘, ‘40‘, ‘35‘, ‘5‘, ‘4‘, ‘3‘] [‘1‘, ‘2‘, ‘60‘, ‘5‘, ‘4‘, ‘3‘]
以上是关于re:模块的主要内容,如果未能解决你的问题,请参考以下文章