本文正在参加「Python主题月」,详情查看活动链接
导语
由于日常开发场景中经常涉及到关于正则匹配,比如设备采集信息,筛选配置文件,过滤相关网页元素等,所有针对Python中正则匹配的Re模块,需要总结和梳理的地方挺多。这篇文章主要是归纳平时会经常使用到的一些函数,以及在使用过程中会遇到的坑。
正则表达式
正则匹配的使用心得:
- 可以将一大批数据进行预处理,去除掉一些多余的符号,比如换行,如果出现多个空格,可以换成单个空格。
- 在获取数据进行处理时,尽可能获取指定需要的数据,减少其他数据的干扰,同时也能提高传输的效率;
- 可以设置起始符和终结符用于筛选多个子元素
关于正则表达式语法,不再赘述,可以参考网上的文档,这里具体不做总结;
Re模块
re模块是Python用来处理正则表达式匹配操作的模块。
Re模块常用函数:
re.search(pattern, string, flags=0)
import re
text= "Hello, World!"
re.search("[A-Z]", text)
备注:
- pattern为正则表达式,string为需要匹配的字符串,flags为正则表达式的标志;
- search函数扫描整个字符串找到匹配正则表达式的第一个位置,并且返回相应的匹配对象, 如果没匹配到则返回None;
re.match(pattern, string, flags=0)
re.fullmatch(pattern, string, flags=0)
import re
text="Hello,World"
re.match("[a-z]", text)
re.fullmatch("\S+", text)
备注:
- match函数从开头开始匹配正则表达式,如果开头的单个或多个字符匹配到了正则表达式样式,则返回一个匹配对象,反之,返回None;
- 注意区分match和search,match函数是检查字符串开头,search函数是检查字符串的任意位置;
- fullmatch是如果整个string都匹配到正则表达式,返回一个相应的匹配对象,否则返回一个None;
re.split(pattern, string, maxsplit=0, flags=0)
import re
text = "aJ33Sjd3231ssfj22323SSdjdSSSDddss"
re.split("([0-9]+)", text)
re.split("[0-9]+", text)
备注:
- split函数中使用正则表达式分开string,如果在正则表达式中能检测到括号,则分割的字符串会保留在列表中;
- maxsplit,最大的分割次数,分割完剩下的字符串都会全部返回到列表中最后一个元素;
re.findall(pattern, string, flags=0)
re.finditer(pattern, string, flags=0)
import re
text = "aJ33Sjd3231ssfj22323SSdjdSSSDddss"
a = re.findall("[0-9]+", text)
print(a)
b = re.finditer("[0-9]+", text)
for i in b:
print(i.group())
备注:
- findall()函数,string从左往右进行扫描,匹配正则表达式,将所有匹配到的按顺序排列组成列表返回;
- finditer()函数,string从左往右进行扫描,匹配正则表达式,将结果按照顺序排列返回一个迭代器iterator,迭代器中保存了 匹配对象;
re.sub(pattern, repl, string, count=0, flags=0) re.subn(pattern, repl, string, count=0, flags=0)
text = "aJ33Sjd3231ssfj22323SSdjdSSSDddss"
a = re.sub("[0-9]", "*", text)
b = re.subn("[0-9]", "*", text)
print(a)
print(b)
备注:
- sub函数使用repl替换string中每一个匹配的结果,然后返回替补的结果,count参数表示替换次数,默认全部替换;
- subn函数行为sub相同,但是返回一个元组(字符串,替换次数)
Re正则表达式对象
re.compile(pattern, flags=0)
import re
prog = re.compile("\<div[\s\S]*?class=\"([\s\S]*?)\"[\s\S]*?\>")
text = '<div class="tab" style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;">'
prog.search(text)
prog.findall(text)
备注:
- compile函数可以将正则表达式编译成一个正则表达式对象,通过对象提供的方法进行匹配搜索;
- 一般在需要多次使用这个正则表达式的情况下,使用re.compile()和保存这个正则对象以便复用,可以使程序更加高效;
- 正则表达式对象提供的方法可以参看以上Re常用函数;
Re匹配对象
当常用函数或者正则表达对象匹配搜索返回的_sre.SRE_Match对象则称为匹配对象
Match.group([gourp1,....])
Match.groups(default=None)
Match.groupdict(default=None)
import re
a = "Hello, World, root"
b = re.search("(\w+), (\w+), (?P<name>\w+)", a)
print(b.group(0))
print(b.group(1))
print(b.groups())
print(b.groupdict())
备注:
- group方法返回一个或者多个匹配的子组,即括号()中的组合,默认是返回整个匹配;
- groups方法,返回一个元组,包含所有匹配的子组;
- groupdict方法,返回一个字典,包含所有的命名子组;