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方法,返回一个字典,包含所有的命名子组;

正则表达式的适用范围还是十分广泛的,希望这篇文章能对你学习Python有所帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值