一、 引言

在《第11.2节 Python 正则表达式支持函数概览》介绍了re模块的主要函数,在《第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer》重点介绍了几个搜索函数。这些介绍的搜索函数都是直接使用正则表达式去匹配搜索文本,实际上re模块还支持将正则表达式先编译再搜索匹配,这种先编译后搜索在同一个正则表达式多次去执行匹配时可以提高匹配执行效率。

二、 re.compile函数

  1. 语法:compile(pattern, flags=0)
  2. 语法释义:

    pattern是要匹配的正则表达式,flags是在《第11.2节 Python 正则表达式支持函数概览》介绍的搜索标记。
  3. 返回结果:

    返回结果是一个类型为re.Pattern的对象,该对象称为 “正则表达式对象”或“正则对象”。该对象可以直接使用自己的方法search、match等进行搜索和匹配。

三、 正则对象Pattern的属性

  1. Pattern.flags:正则匹配标记。这是可以传递给 compile() 的参数,任何 (?…) 内联标记,隐性标记比如 UNICODE 的结合。不过这里的值是一个数字,而不是使用标记的常量,数字与匹配标记常量对应关系请参考《第11.2节 Python 正则表达式支持函数概览》;
  2. Pattern.groups:捕获组合的数量;
  3. Pattern.groupindex:在命名组内记录组名和组序号的映射关系。如果没有命名组,那字典就是空的。
  4. Pattern.pattern:编译对象的对应的正则表达式。

四、 正则对象的方法

  1. Pattern.search(string[, pos[, endpos]])

    这个方法与re.search函数功能类似,扫描整个 string 寻找第一个匹配位置, 并返回一个相应匹配对象。如果没有匹配,就返回 None。不过比re.search函数多了两个可选参数,可选的第二个参数 pos 给出了字符串中开始搜索的位置索引,默认为 0,如果大于0,对于元字符 ‘^’ 和特殊序列\A样式字符匹配字符串真正的开头,或换行符后面的第一个字符,但不会匹配索引规定开始的位置。

    可选参数 endpos 限定了字符串搜索的结束;当endpos比搜索文本长度小的时候,字符串末尾的匹配如’$’会匹配到endpos对应位置,也就是实际搜索文本变成了原搜索文本从开始到endpos位置切片对应的新搜索文本。

案例:

>>> str='Learning Python  with LaoYuan123'
>>> str[22:29]
'LaoYuan'
>>> patstr='LaoYuan$'
>>> pat=re.compile(patstr)
>>> pat.search(str,endpos=29)
<re.Match object; span=(22, 29), match='LaoYuan'>
>>>

上述案例中搜索文本结尾是123,但指定了结束位置刚好到搜索模式串,因此$最终匹配成功。

  1. Pattern.match(string[, pos[, endpos]])

    该方法与re.match相对应,功能相差不多,从 string 的 开始位置 能够找到这个正则样式的任意个匹配,就返回一个相应的 匹配对象。如果不匹配,就返回 None 。可选参数 pos 和 endpos 与 search() 含义相同。

    如:
>>> patstr='Python'
>>> str='LaoYuanPython'
>>> pat=re.compile(patstr)
>>> pat.match(str,7)
<re.Match object; span=(7, 13), match='Python'>
>>>
  1. Pattern.fullmatch(string[, pos[, endpos]])

    该方法与re.fullmatch()函数相对应,如果整个 string 匹配这个正则表达式,就返回一个相应的 匹配对象 。 否则就返回 None。可选参数 pos 和 endpos 与 Pattern.search() 含义相同。

    案例:
>>> pat=re.compile(r"第[一-十][章回](.)*")
>>> pat.fullmatch('第二回 悟彻菩提真妙理 断魔归本合元 ')
<re.Match object; span=(0, 19), match='第二回 悟彻菩提真妙理\u3000断魔归本合元 '>
>>>
  1. Pattern.split(string, maxsplit=0)

    等价于 re.split 函数,只是使用了编译后的正则对象来调用。

    案例:
>>> pat=re.compile(r'(\W+)')
>>> pat.split('Hello,world')
['Hello', ',', 'world']
>>>
  1. Pattern.findall(string[, pos[, endpos]])

    类似函数 re.findall函数,只是使用了正则对象来调用,比re.findall多了两个可选参数 pos 和 endpos用于限制搜索范围,这两个参数的作用与Pattern.search方法的这两个参数一样。

    案例:
>>> pat=re.compile(r'(\w+)')
>>> pat.findall('Learning python with LaoYuan')
['Learning', 'python', 'with', 'LaoYuan']
>>>
  1. Pattern.finditer(string[, pos[, endpos]])

    类似函数re.finiter() , 使用了编译后的正则对象来调用,比re.finiter()多了两个可选参数 pos 和 endpos用于限制搜索范围,这两个参数的作用与Pattern.search方法的这两个参数一样。

    案例:
>>> pat=re.compile(r"第[一-十][章回]")
>>> for i in pat.finditer("第一回灵根育孕源流出 心性修持大道生 第二回悟彻菩提真妙理 断魔归本合元神"):print(i) <re.Match object; span=(0, 3), match='第一回'>
<re.Match object; span=(19, 22), match='第二回'>
>>>
  1. Pattern.sub(repl, string, count=0)

    等价于 re.sub函数,使用了编译后的正则对象来调用。

    案例:
>>> patstr=r'(?i)(python)'
>>> pat=re.compile(patstr)
>>> pat.sub(r'\1->\g<1>->Python','Learning python with LaoYuan,LaoYuanPython accompanies you to progress')
'Learning python->python->Python with LaoYuan,LaoYuanPython->Python->Python accompanies you to progress'
>>>
  1. Pattern.subn(repl, string, count=0)

    等价于 re.subn() 函数,使用了编译后的正则对象来调用。
>>> pat.subn(r'\1->\g<1>->Python','Learning python with LaoYuan,LaoYuanPython accompanies you to progress')
('Learning python->python->Python with LaoYuan,LaoYuanPython->Python->Python accompanies you to progress', 2)
>>>

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


请大家多多支持,点赞、评论和加关注!谢谢!

第11.25节 Python正则表达式编译re.compile及正则对象使用的更多相关文章

  1. 第11.13节 Python正则表达式的转义符”\”功能介绍

    为了支持特殊元字符在特定场景下能表示自身而不会被当成元字符进行匹配出来,可以通过字符集或转义符表示方法来表示,字符集表示方法前面在<第11.4节 Python正则表达式搜索字符集匹配功能及元字符 ...

  2. 第11.15节 Python正则表达式转义符定义的特殊序列

    一. 引言 在前面<第11.13节 Python正则表达式的转义符"\"功能介绍>介绍了正则表达式转义符'\',只不过当时作为转义符主要是用于在正则表达式中表示元字符自 ...

  3. 第11.10节 Python正则表达式的非贪婪模式的重复匹配:'*?', '+?',和 '??'

    在<第11.9节 Pytho正则表达式的贪婪模式和非贪婪模式>老猿简单介绍了贪婪模式和非贪婪模式,并说明'', '+',和 '?' 修饰符都是 贪婪的:它们在字符串进行尽可能多的匹配.有时 ...

  4. 第11.9节 Python正则表达式的贪婪模式和非贪婪模式

    在使用正则表达式时,匹配算法存在贪婪模式和非贪婪模式两种模式,在<第11.8节 Pytho正则表达式的重复匹配模式及元字符"?". "*". " ...

  5. 第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用

    一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>介绍了组匹配模式,在一个正则表达式内可以定义多个组,每个组都有一个顺 ...

  6. 第11.6节 Python正则表达式的字符串开头匹配模式及元字符“^”(插入符、脱字符)功能介绍

    符号"^"为插入符,也称为脱字符,在Python中脱字符表示匹配字符串的开头,即字符串的开头满足匹配模式的要求.这个功能有点类似搜索函数match,只是这是通过搜索模式来指定,而m ...

  7. 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍

    在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...

  8. 第11.7节 Python正则表达式的字符串结尾匹配模式及元字符“$”功能介绍

    符号"$"表示匹配字符串的结尾,即字符串的结尾满足匹配模式的要求. 在 MULTILINE 模式(搜索标记中包含re.MULTILINE,关于搜索标记的含义请见<第11.2节 ...

  9. 第11.4节 Python正则表达式搜索字符集匹配功能及元字符”[]”介绍

    Python正则表达式字符集匹配表示是指搜索一个字符,该字符在给定的一个字符的集合中.元字符'['和']'是用于组合起来定义匹配字符集,匹配模式中使用 '['开头,并使用']'结尾来穷举搜索的字符可能 ...

随机推荐

  1. 微信小程序获取普通二维码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. lvs负载简介,原理,常见使用案例及Keepalived高可用

    Lvs简介 基础概念 LVS(Linux Virtual Server)即Linux虚拟服务器,是由张文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中(2.6及以上版本内核) ...

  3. 二维码生成与windows系统IP查询功能

    一个木函是一款强大的手机软件,里面囊括了很多小功能,每一个都基本可以堪称小程序.那么,这些小功能具体是怎么实现的呢?让我们来一起来探讨二维码生成.IP查询这两个功能吧! 一.二维码生成 首先,我们来看 ...

  4. CSS圣杯布局、双飞翼布局详解

    三栏布局中,经典中的经典应该就是圣杯布局.双飞翼布局没跑了.双飞翼布局和圣杯布局其实是一样的,只不过在写法上有些不同,其布局都是左右固定宽度,中间宽度自适应. 先熟悉一下圣杯布局.双飞翼布局中的特点: ...

  5. c++的基本点

    C++的要点:    一个思想:抽象(和分类)的思想:    三个概念:类.对象.消息:    三个特征:封装.继承.多态:    一个观念:函数服务于数据.      程序 = 对象 + 消息   ...

  6. 指针常量&常量指针&指向常量的指针常量

    搞不懂不吃晚饭 (1)指针常量 指针常量是一个常量,但是是指针修饰的. 格式:int * const p; 例如 int a, b; int * const p = &a;//指针常量 //分 ...

  7. SpringBoot整合Xxl-Job

    一.下载Xxl-Job源代码并导入本地并运行 Github地址:https://github.com/xuxueli/xxl-job 中文文档地址:https://www.xuxueli.com/xx ...

  8. CTF-Web-强网杯 2019-随便注

    题目链接 题目链接-supersqli FUZZ测试 fuzz出,order by测出数据库查询列数2列,注释符号#,select|update|delete|drop|insert|where|被过 ...

  9. 兄弟萌,这份SpringMVC框架学习笔记真的建议反复看,写的太细了

    概述 是Spring为展现层提供的基于MVC设计理念的Web框架,通过一套MVC注解,让POJO成为处理请求的控制器,而无需实现任何接口 支持REST风格的URL请求 采用松散耦合的可插拔组件结构,比 ...

  10. 2019年第十届蓝桥杯【C++省赛B组】D、E、G、H、I题解

    这场有几道题目思路,在之前比赛中遇到过 D. 数的分解 #枚举 题意 将\(2019\)分解成\(3\)个各不相同的正整数之和,并且每个正整数都不包含数字\(2\)和\(4\),一共有多少种分解方法? ...