导读

在上节中,讲了原子、元字符,以及如何使用这些来编写正则表达式,但有一个特点就是,写出来的表达式如果需要进行相应的内容匹配,就必须通过调用相应的函数(方法)来实现。

如果需要复习上节元字符等内容,可看文章:Python3 入门教程——RE正则表达式(1)— 元字符

编译正则表达式

正则表达式可分为”解释型”和”编译型”两种,在开发中,通常都会将正则进行编译处理,这样可以使得程序执行的速度更快,效率更高。

在 Python 中,re 模块提供一个 compile() 函数对正则表达式进行编译,下面演示编译后的正则使用:

import re
string = "learnpythonstudy"
pattern = re.compile("python")   # 预编译
result = pattern.search(string)   # 匹配合适的结果
print(result)

实例输出:

<_sre.SRE_Match object; span=(5, 11), match='python'>

分析:在上面可以看到,在第三行处对正则表达式进行了预先编译,并将其内容重新传递给了 pattern ,此时pattern继承了 re 的相关内容,所以在第四行中调用正则匹配内容时,使用pattern代替了原先的 re,函数中也不需要再传入正则表达式了,直接传入要匹配的string字符串即可!

RE中常用的方法

re 模块提供了一系列的函数(方法)共开发者使用,完整的列表可查阅 Python Library Reference,下面只介绍一些常用的函数。

正则表达式常见方法:

方法功能
match()从起始位置开始匹配,内容存在则返回 MatchObject 实例,否则返回 None
search()查找字符串中是否有 RE 匹配的内容,有则返回 SearchObject 实例,否则返回 None
findall()查找 RE 匹配的内容,并将其所有内容以列表形式返回
finditer()查找 RE 匹配的全部内容,并将其以 迭代器 形式返回
sub()根据正则,替换源字符串中的某些字符
spilt()根据正则,对源字符串进行切割
PS:使用这些方法的过程中,可以加入上节中讲到的 “模式修正符” 进行灵活运用。

match( ) 方法

功能:从源字符串的起始位置开始匹配,如果内容存在则返回内容,反则返回 None

语法格式:

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

参数说明:

  • pattern:传入需要匹配的正则表达式。
  • string:传入需要匹配的源字符串。
  • flags:标志位(可选参数),可传入“模式修正符”等信息。

实例如下:

import re
pattern = ".python"

string1 = "ApythonBC"
string2 = "ABCpythonCD"

result1 = re.match(pattern, string1)   # 匹配
result2 = re.match(pattern, string2)   # 不匹配

print(result1)
print(result2)

实例输出:

<_sre.SRE_Match object; span=(0, 7), match='Apython'>
None

分析:(略)

search( ) 方法

功能:在源字符串中进行全局检索匹配,如果源字符串中存在匹配的内容,返回 第一个 匹配的相关结果(即使有多个符合匹配的内容,也只是返回首个匹配的结果),反之,如果没有匹配的内容则返回 None

语法格式:

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

实例演示:

(忽略,具体看前面的调用过程。)

findall()方法

功能:从字符串中检索出所有匹配的内容,并以字符串形式返回,反之返回一个空的列表。

语法格式:

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

实例如下:

import re
pattern = "python."
string = "ABCpython2_learnpython3CDE"
result = re.findall(pattern, string)   # 全文检索匹配所有内容
print(result)

实例输出:

['python2', 'python3']

分析:(略)

finditer( ) 方法

功能:与 findall() 方法类似,同样是全局检索匹配,不一样的是 finditer( ) 返回的是一个迭代器,而 findall( ) 返回的是一个列表。

语法格式:

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

实例如下:

import re
pattern = "python."
string = "ABCpython2DEFpython3GHIpython4567"
result = re.finditer(pattern, string)

for i in result:
    print(i.group())     # 通过 group() 方法读取内容

实例输出:

python2
python3
python4

分析:检索到的结果,返回的是一个迭代器,通过for循环且结合 group() 方法遍历出每一个值。

sub( )方法

功能:根据需求替换源字符串中指定的内容,可以是全部,也可是指定替换个数。

语法格式:

re.sub(pattern, repl, string, count=0, flags=0)

参数说明:

  • pattern:传入需要匹配的正则表达式。
  • repl:替换后的字符串
  • string:传入需要匹配的源字符串。
  • count:指定替换的个数
  • flags:标志位(可选参数),可传入“模式修正符”等信息。

实例如下:

import re
pattern = "python."
string = "ABCpython2DEFpython3GHIpython4567"

result1 = re.sub(pattern, "java", string)    # 默认替换所有
result2 = re.sub(pattern, "java", string, 2)    # 替换 2 次

print(result1)
print(result2)

实例输出:

ABCjavaDEFjavaGHIjava567
ABCjavaDEFjavaGHIpython4567

分析:(略)

split( ) 方法

功能:根据正则将源字符串进行切割,可全局切割或指定切割次数,最终以列表形式返回。

语法格式:

re.split(pattern, string, maxsplit=0, flags=0)

参数说明:

  • pattern:传入需要匹配的正则表达式。
  • string:传入需要匹配的源字符串。
  • maxsplit:指定最大的切割次数
  • flags:标志位(可选参数),可传入“模式修正符”等信息。

实例输出:

import re
pattern = "python"   # 设定以 "python" 为切割标识符
string = "ABCpython2DEFpython3GHIpython4567"

result1 = re.split(pattern, string)    # 全局切割
result2 = re.split(pattern, string, 2)   # 只切割 2 次

print(result1)
print(result2)

实例输出:

['ABC', '2DEF', '3GHI', '4567']
['ABC', '2DEF', '3GHIpython4567']

各Object 实例输出的方法

在常用函数调用过程中,有部分函数输出的是并非是匹配的最终内容,而是输出了一个对象信息,如:<_sre.SRE_Match object; span=(0, 7), match='Apython'>

类似的函数有:match()、search()...,下面就来讲讲如何通过对象,输出其匹配的内容。

常见Object输出方法,如下:

方法功能
group()返回 RE 匹配的字符串值
start()返回 匹配开始的位置
end()返回 匹配结束的位置
span()以元组形式返回 匹配( 开始,结束 ) 的位置

通过以上方法,可以实现取值、取字符位子等信息。

实例如下:

import re
pattern = "python."   # 设定以 "python" 为切割标识符
string = "ABCpython2DEFpython3GHIpython4567"

result = re.search(pattern, string)

print(result.group())    # 输出匹配的内容
print(result.span())   # 输出匹配的位置信息
print(result.start())    # 输出匹配内容的 起始位置
print(result.end())   # 输出匹配内容的 结束位置

输出结果:

python2
(3, 10)
3
10

完整学习教程请访问Python3 入门教程——目录索引

最后修改:2022 年 06 月 07 日
如果觉得我的文章对你有用,请随意赞赏