Python正则表达式匹配|Python 主题月

2,156 阅读4分钟

本文正在参加「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方法,返回一个字典,包含所有的命名子组;

参考:

docs.python.org/zh-cn/3/lib…
www.cnblogs.com/huxi/archiv…