导读
在上节中,讲了原子、元字符,以及如何使用这些来编写正则表达式,但有一个特点就是,写出来的表达式如果需要进行相应的内容匹配,就必须通过调用相应的函数(方法)来实现。
如果需要复习上节元字符等内容,可看文章: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 入门教程——目录索引