python使用正则表达式_配合实例讲解

本文详细介绍了Python中使用re模块进行正则表达式操作的方法,包括re.findall(),re.match(),re.search(),re.fullmatch()和re.finditer()等函数的用法,以及匹配对象的属性和正则匹配参数。此外,还强调了正则对象的创建和复用以提高效率。
摘要由CSDN通过智能技术生成

简介

接上一篇文章介绍了正则表达式的语法规则,这里我们探讨一下如何在python脚本中使用正则表达式

使用模块

python中使用re模块进行正则表达式的使用,可以直接import re即可导入,属于python标准库自带模块

模块中常用函数介绍

re.findall(pattern, string, flags=0)

返回 patternstring 中的所有非重叠匹配,以字符串列表或字符串元组列表的形式。对 string 的扫描从左至右,匹配结果按照找到的顺序以列表形式返回。 空匹配也包括在结果中。

返回结果取决于模式中捕获组的数量。如果没有组,返回与整个模式匹配的字符串列表。如果有且仅有一个组,返回与该组匹配的字符串列表。如果有多个组,返回与这些组匹配的字符串元组列表。非捕获组不影响结果。

举例:

import re

str01 = "[2023-03-31 12:02:02] [mod1] signal_a -23 signal_b -38  result 1 test successful!"

match = re.findall("-?[0-9]+", str01)        # 匹配所有±数字
print(f"findall匹配结果={match}")

输出结果如下:

findall匹配结果=['2023', '-03', '-31', '12', '02', '02', '1', '-23', '-38', '1']

re.match(pattern, string, flags=0)

如果 string 开始的0或者多个字符匹配到了正则表达式样式(注意这里只匹配字符串开头位置),就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。

注意即便是 MULTILINE 多行模式, re.match() 也只匹配字符串的开始位置,而不匹配每行开始。

如果你想定位 string 的任何位置,使用 search() 来替代

举例:

import re

str01 = "[2023-03-31 12:02:02] [mod1] signal_a -23 signal_b -38  result 1 test successful!"

ret = re.match("\[[0-9]+", str01)
print(f"match匹配结果= {ret}")

输出结果如下:

match匹配结果= <re.Match object; span=(0, 5), match='[2023'>

re.search(pattern, string, flags=0)

扫描整个 字符串 找到匹配样式的第一个位置(注意这里与match的区别是扫描整个字符串,但也只是返回第一个匹配到的匹配对象),并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。

re.fullmatch(pattern, string, flags=0)

如果整个 string 匹配到正则表达式样式,就返回一个相应的 匹配对象(这里可以简单理解为全字匹配,也就是只有整个字符串满足匹配要求,才算匹配到) 。 否则就返回一个 None ;注意这跟零长度匹配是不同的。

re.finditer(pattern, string, flags=0)

patternstring 里所有的非重复匹配,返回为一个迭代器 iterator 保存了 匹配对象(这里可以简单理解为,返回的结果可以用for循环遍历迭代处理) 。 string 从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。

举例:

import re

str01 = "[2023-03-31 12:02:02] [mod1] signal_a -23 signal_b -38  result 1 test successful!"

match = re.match("\[[0-9]+", str01)
print(f"match匹配结果= {match}")

match = re.search("[0-9]+", str01)
print(f"search匹配结果={match}")

match = re.fullmatch("[0-9]+", "32")
print(f"fullmatch匹配结果={match}")

match = re.finditer("-?[0-9]+", str01)
print(f"finditer匹配结果={match}")
for i in match:
    print(i)
    break

输出结果如下:

match匹配结果= <re.Match object; span=(0, 5), match='[2023'>
search匹配结果=<re.Match object; span=(1, 5), match='2023'>
fullmatch匹配结果=<re.Match object; span=(0, 2), match='32'>
finditer匹配结果=<callable_iterator object at 0x00000267DA59D5E0>
<re.Match object; span=(1, 5), match='2023'>

匹配对象的理解

上面的match函数返回的是匹配对象,对应输出是 <re.Match object; span=(0, 5), match=‘[2023’>,很多人看到这里会容易迷糊,不知道怎么使用,这里可以从名字上看出返回的是匹配对象,重点在对象上,也就是说返回的结果包含了很多属性,可以看一下如下例子,就明白了。

举例:

import re

str01 = "[2023-03-31 12:02:02] [mod1] signal_a -23 signal_b -38  result 1 test successful!"

match = re.match("\[[0-9]+", str01)
print(f"match匹配结果= {match}")
print(f"match匹配结果= {match.group()}")
print(f"match匹配结果= {match.span()}")
print(f"match匹配结果= {match.pos}")
print(f"match匹配结果= {match.endpos}")
print(f"match匹配结果= {match.start()}")
print(f"match匹配结果= {match.end()}")

输出结果如下:

match匹配结果= <re.Match object; span=(0, 5), match='[2023'>
match匹配结果= [2023
match匹配结果= (0, 5)
match匹配结果= 0
match匹配结果= 81
match匹配结果= 0
match匹配结果= 5

从上面的例子可以看出,匹配对象,包含了很多属性可以直接调用,这里讲一下常用的属性如下。

Match.group([group1, _…_])

返回一个或者多个匹配的子组。常用match.group(),获取所有匹配结果,这里有一个匹配子组的概念,可以不用纠结,平常很少用。

Match.start([_group_])

Match.end([_group_])

返回 group 匹配到的字串的开始和结束下标(索引),通常不用传入group参数。

Match.span([_group_])

对于一个匹配 m , 返回一个二元组 (m.start(group), m.end(group)) 。 注意如果 group 没有在这个匹配中,就返回 (-1, -1)group 默认为0,就是整个匹配。

Match.pos

pos 的值,这个是正则引擎开始在字符串搜索一个匹配的索引位置。

Match.endpos

endpos 的值,这个是正则引擎停止在字符串搜索一个匹配的索引位置。

Match.string

传递到 match()search() 的字符串

正则匹配参数

在正则匹配函数中,都有一个flag的参数,比如match(pattern, string, flags=0),这里的flag就是正则匹配参数,常用的正则匹配参数如下:

re.A

re.``ASCII

\w, \W, \b, \B, \d, \D, \s\S 只匹配ASCII,而不是Unicode。这只对Unicode样式有效,会被byte样式忽略。相当于前面语法中的内联标志 (?a)

注意,为了保持向后兼容, re.U 标记依然存在(还有他的同义 re.UNICODE 和嵌入形式 (?u) ) , 但是这些在 Python 3 是冗余的,因为默认字符串已经是Unicode了(并且Unicode匹配不允许byte出现)。

re.I

re.IGNORECASE

进行忽略大小写匹配;表达式如 [A-Z] 也会匹配小写字符。Unicode匹配(比如 Ü 匹配 ü)同样有用,除非设置了 re.ASCII 标记来禁用非ASCII匹配。当前语言区域不会改变这个标记,除非设置了 re.LOCALE 标记。这个相当于内联标记 (?i)

注意,当设置了 IGNORECASE 标记,搜索Unicode样式 [a-z][A-Z] 的结合时,它将会匹配52个ASCII字符和4个额外的非ASCII字符: ‘İ’ (U+0130, 拉丁大写的 I 带个点在上面), ‘ı’ (U+0131, 拉丁小写没有点的 I ), ‘ſ’ (U+017F, 拉丁小写长 s) and ‘K’ (U+212A, 开尔文符号).如果使用 ASCII 标记,就只匹配 ‘a’ 到 ‘z’ 和 ‘A’ 到 ‘Z’ 。

re.M

re.MULTILINE

设置以后,样式字符 '^' 匹配字符串的开始,和每一行的开始(换行符后面紧跟的符号);样式字符 '$' 匹配字符串尾,和每一行的结尾(换行符前面那个符号)。默认情况下,’^’ 匹配字符串头,'$' 匹配字符串尾。对应内联标记 (?m)

re.S

re.DOTALL

'.' 特殊字符匹配任何字符,包括换行符;如果没有这个标记,'.' 就匹配 除了 换行符的其他任意字符。对应内联标记 (?s)

正则对象

前面的内容,貌似就足以应付常用的正则字符匹配了,为什么会多出一个正则对象呢?要回答这个问题,可以继续向下了解。

首先生成正则对象,需要依赖一个函数re.compile

re.compile(pattern, flags=0)

将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象可以直接调用正则的常用方法,如 match(), search() 等。

这个表达式的行为可以通过指定 flag 的值来改变。值可以是上文的任意正则匹配参数,可以通过位的OR操作来结合( | 操作符)。

举例1

prog = re.compile(pattern)
result = prog.match(string)

等价于

result = re.match(pattern, string)

举例2

import re
str01 = "[2023-03-31 12:02:02] [mod1] SIGNAL_A -23 signal_a -38  result 1 test successful!"
pattern = 'signal'
signal_match = re.compile(pattern)
signal_match_ignore = re.compile(pattern, re.I)

ret = signal_match.findall(str01)
print(f"正则对象匹配结果= {ret}")
ret = signal_match_ignore.findall(str01)
print(f"忽略大小写正则对象匹配结果= {ret}")

运行结果

正则对象匹配结果= ['signal']
忽略大小写正则对象匹配结果= ['SIGNAL', 'signal']

到此处,基本就明白正则对象是怎么回事了,另外使用正则对象还有一个不可忽视的重要作用:如果需要多次使用同一个正则表达式的话,使用 re.compile() 生成正则对象以便复用,可以让程序更加高效。

参考文档

  1. 本文主要介绍了python正则模块常用的一些功能,对于更详细的功能请参考python官方文档:https://docs.python.org/zh-cn/3.10/library/re.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩转智能机器人

但行好事,莫问前程,日拱一卒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值