Python正则表达式指南

 原文:http://blog.csdn.net/qdx411324962/article/details/46799831

Python3(2):正则表达式与Python(RE)模块

原文:https://zhuanlan.zhihu.com/p/39365124

http://www.cnblogs.com/yyds/p/6953348.html

一、re 模块介绍

Python 通过使用 re 模块来支持支持 Perl (Perl 5 )风格的正则表达式。Python中的re模块提供正则表达式的引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操作。re模块为这些操作分别提供了模块级别的函数以及相关类的封装。

1、re模块提供的类

Python中的re模块中最重要的两个类:

Regular Expression Objects:正则表达式对象,用于执行正则表达式相关操作的实体

Match Objects:正则表达式匹配对象,用于存放正则表达式匹配的结果并提供用于获取相关匹配结果的方法

1.1 正则表达式对象中的方法和属性

通过re模块的compile()函数编译得到的正则表达式对象(下面用regex表示)支持如下方法:

参数说明:

  • string: 要匹配或处理的字符串
  • pos: 可选参数,表示从string字符串的哪个位置开始,相当于先对字符串做切片处理string[pos:]
  • endpos: 可选参数,表示到string字符串的哪个位置结束(不包含该位置)
  • maxsplit: regex.split()方法的可选参数,表示最大切割次数;默认值为0,表示能切割多少次就尽可能多的切割多少次
  • count: regex.sub()和regex.subn()方法的可选参数,表示最大替换次数;默认为0,表示能替换多少次就尽可能多的替换多少次
  • repl: sub和subn函数中的repl表示replacement,用于指定将匹配到的子串替换成什么内容,需要说明的是该参数的值可以是一个字符串,也可以是一个函数

说明: 如果指定了pos和endpos参数,就相当于在进行正则处理之前先对字符串做切片操作 string[pos, endpos],如regex.search(string, 5, 50)就等价于regex.search(string[5:50]),也等价于regex.search(string[:50], 5);如果endpos比pos的值小,则不会找到任何匹配。

1.2 正则表达式匹配对象的方法和属性

调用正则表达式对象的regex.match()、regex.fullmatch()和regex.search()得到的结果就是一个正则表达式匹配对象,正则表达式匹配对象支持以下方法和属性:

参数说明:

  • template: match.expand()方法中的template参数是一个模板字符串,这个字符串中可以使用分组对应的的数值索引进行后向引用(如:\1,\2)或命名后向引用(如\g<1>,\g<NAME>)来表示某个分组的占位符;match.expand()方法的执行过程实际上就是通过sub()方法把template字符串中的这些分组占位符用当前匹配对象中的数据进行替换。
  • default: match.groups()与match.groupdict()方法中的default都是为未匹配成功的捕获组提供默认匹配值的。
  • group: match.group()、match.start()、match.end()和match.span()方法中的group参数都表示要选择的分组索引值,1表示第一个分组,2表示第二个分组,依次类推,group参数的默认值是0,表示整个正则表达式所匹配的内容。

二、re模块提供的函数

1、re模块提供了以下几个模块级别的函数

  • pattern:只能是字符串
  • string: 需要用正则表达式来匹配的字符串对象
  • flags: 一个标志位,它会影响正则表达式对象的匹配行为,可取值下面会介绍;但是有一点需要说明的是,只有当pattern参数是字符串时才能指定这个flags参数,否则会报错;如果pattren参数是一个正则表达式对象,则flags参数需要在调用re.compile()函数时指定。
  • repl: sub和subn函数中的repl表示replacement,用于指定将匹配到的子串替换成什么内容,需要说明的是该参数的值可以是一个字符串,也可以是一个函数
  • count: sub和subn函数中的count表示最多可替换次数
  • maxsplit: split函数中的maxsplit蚕食表示最大分隔次数

说明: 通过对比会发现,上面这些re模块级别的函数除了re.compile、re.purge和re.escape这几个函数外,其它函数名都与正则表达式对象支持的方法同名。实际上re模块的这些函数都是对正则表达式对象相应方法的封装而已,功能是相同的。只是少了对pos和endpos参数的支持,但是我们可以手动通过字符串切片的方式来达到相应的需求。我们应该尽可能的使用模块级别的函数,这样可以增强代码的兼容性。

2.、标志位flags

flags参数在上面这些模块函数中是要个可选参数,re模块中预定了该参数可取的值:

说明: 这些flag可以单独使用,也可以通过逻辑或操作符'|'进行拼接来联合使用

三、使用re模块的步骤

1、使用re模块进行正则匹配操作的步骤

  • 1)编写表示正则表达式规则的Python字符串str;
  • 2)通过re.compile()函数编译该Python字符串获得一个正则表达式对象(Pattern Object)p;
  • 3)通过正则表达式对象的p.match()或p.fullmatch()函数获取匹配结果--匹配对象(Match Object)m;
  • 4)通过判断匹配对象m是否为空可知是否匹配成功,也可以通过匹配对象m提供的方法获取匹配内容。

2、 使用re模块进行内容查找、替换和字符串分隔操作的步骤

  • 1)编写表示正则表达式规则的Python字符串str;
  • 2)通过re.compile()函数编译该Python字符串获得一个正则表达式对象(Pattern Object)p;
  • 3)通过正则表达式对象的p.search()或p.findall()或p.finditer()或p.sub()或p.subn()或p.split()函数完内容查找、替换和字符串分隔操作并获取相应的操作结果;

四、正则表达式字符串前的r前缀

编写一个表示正则表达式规则的Python字符串,那么正则表达式与Python字符串之间是什么关系呢?另外,我们通常都在一个正则表达式字符串前加上一个前缀r是何用意呢?

因为正则表达式并不是Python语言的核心部分(有些应用程序根本就不需要正则表达式,re模块就像socket或zlib一样,只是包含在Python中的一个简单的C语言扩展模块),也没有创建专门的语法来表示它们,所以在Python中正则表达式是以Python字符串的形式来编写并进行处理的。但是,我们应该知道的是字符串有 字符串的字面值(我们给一个字符串赋的值) 和 字符串的实际值(这个字符串的打印值),且正则表达式引擎把一个字符串作为正则表达式处理时,所取的是这个字符串的实际值,而不是它的字面值。

问题1:

字符串的字面值与字符串的实际值 不一定是等价的,因为有些字符组合起来表示的是一个特殊的符号,此时会导致正则表达式错误而无法匹配到想要的结果。比如:\1在正则表达式中表示引用第一个捕获组所匹配到的内容,而在字符串中却表示一个特殊的字符,因此如果一个表示正则表达式的字符串中包含"\1"且没有做任何处理的话,它是无法匹配到我们想要的结果的。如下图所示:

如果想要匹配正确结果就需要对该字符串中表示特殊字符的字符组合进行处理,我们只需要在'\1'前加一个反斜线对'\1'中的反斜线进行转义就可以了,即字符串"\1"的字面值才是\1。如下图所示:

也就是说,一个正则表达式要想用一个Python字符串来表示时,可能需要对这个字符串的字面值做一些特殊的转义处理。

问题2:

现在反过来考虑,\s在正则表达式中表示空白字符,如果我们想匹配一个字符串中'\s'这两个字符,就需要在正则表达式中\s前也加一个反斜线进行转义\\s。那么这时候表示正则表达式的字符串同样不能直接写'\\s',因为它是字符串字面值,其实际值是\s,因此此时也是不能匹配到我们想要的结果的。如下图所示:

如果想要匹配正确结果就需要对该字符串进行一些处理,我们需要在'\\s'前加两个反斜线对'\\s'中的两个反斜线分别进行转义,即字符串"\\\\s"的字面值才是\\s。如下图所示:

字符串的r前缀
通过上面两个问题我们可以得出以下结论:

  • 1)这些问题都是由于反斜线引起的,这种现象也被称为"反斜线瘟疫";
  • 2)Python字符串与正则表达式都使用反斜线进行字符转义,正是由于这种冲突才引起了这些问题;
  • 3)当一个正则表达式中又很多个反斜线要处理时,那无疑将是一种灾难。

怎么办呢?你只需要在表示正则表达式的字符串前加上一个前缀r就可以把这个字符串当然正则表达式来写了 r是Raw,即“原始”的意思,带有r前缀的字符串就叫做“Raw String”,即原始字符串的意思。也就是说当一个字符串带有r前缀时,它的字面值就是其真实值,也就是正则表达式的值。

简单来说,表示正则表达式匹配规则的字符串前面的r前缀是为了解决字符串中的反斜线与正则表达式中的反斜线引起的冲突问题。我们根本无需关心哪些字符会引起这样的冲突,只需要在每个表示正则表达式的字符串前加上一个r前缀就可以了。


参考:

Python正则表达式指南 - AstralWind - 博客园​www.cnblogs.comPython之正则表达式(re模块) - 云游道士 - 博客园​www.cnblogs.com

《Core Python Applications Programming》(THIRD EDITION)人民邮电出版社 Wesley Chun(著)/孙波祥、李斌、李晗(译)

2016-6-1 ISBN:978-7-115-41477-9

(转)正则表达式与Python(RE)模块的更多相关文章

  1. python re 模块和基础正则表达式

    1.迭代器:对象在其内部实现了iter(),__iter__()方法,可以用next方法实现自我遍历. 二.python正则表达式 1.python通过re模块支持正则表达式 2.查看当前系统有哪些p ...

  2. Python::re 模块 -- 在Python中使用正则表达式

    前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...

  3. python常用模块(1):collections模块和re模块(正则表达式详解)

    从今天开始我们就要开始学习python的模块,今天先介绍两个常用模块collections和re模块.还有非常重要的正则表达式,今天学习的正则表达式需要记忆的东西非常多,希望大家可以认真记忆.按常理来 ...

  4. 正则表达式与Python中re模块的使用

    正则表达式与Python中re模块的使用 最近做了点爬虫,正则表达式使用的非常多,用Python做的话会用到re模块. 本文总结一下正则表达式与re模块的基础与使用. 另外,给大家介绍一个在线测试正则 ...

  5. python全栈开发之正则表达式和python的re模块

    正则表达式和python的re模块 python全栈开发,正则表达式,re模块 一 正则表达式 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的 ...

  6. 常用正则表达式与python中的re模块

    正则表达式是一种通用的字符串匹配技术,不会因为编程语言不一样而发生变化. 部分常用正则表达式规则介绍: . 匹配任意的一个字符串,除了\n * 匹配任意字符串0次或者任意次 \w 匹配字母.数字.下划 ...

  7. python 常用模块(转载)

    转载地址:http://codeweblog.com/python-%e5%b8%b8%e7%94%a8%e6%a8%a1%e5%9d%97/ adodb:我们领导推荐的数据库连接组件bsddb3:B ...

  8. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  9. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

随机推荐

  1. 简述各大 Linux 发行版,有主观,不完全,望见谅

    只罗列当前热门的linux发行版 更多关于 Linux 以及 Linux 衍生版的内容可以参阅 中文wiki Debian 系 Debian:开源社区的代表性 linux 系统,每2年一次更新,现在的 ...

  2. Vc6.0 编译发生致命链接错误 :不能打开exe的文件

    错误: fatal error LNK1104: cannot open file "Debug/CeshiToolBar1.exe" 解决方法:打开任务管理器,找到对应的exe应 ...

  3. bootstrap css排版

    smart-form 单行元素: 一般用div包含,class="row" 列元素:用section包含,class="col col-x"(section带有 ...

  4. oracle 触发器序列号自增

    步骤:1.创建表 table 2.创建序列 SEQUENCE 3.创建 触发器 截图实例:

  5. jQuery实现ie浏览器兼容placeholder效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 为什么程序员都不喜欢使用switch而使用if来做条件跳转

    请用5秒钟的时间查看下面的代码是否存在bug.   OK,熟练的程序猿应该已经发现Bug所在了,在第8行和第10行下面我没有添加关键字break; 这就导致这段代码的行为逻辑与我的设计初衷不符了. 缺 ...

  7. acedSSGet使用自定义提示字符:$模式

          ads_name ss; struct resbuf *pRbList=NULL; pRbList=acutBuildList(RTDXF0,_T("lwpolyline,ins ...

  8. 从哈希结构去理解PHP数组

    php的数组实际上就是hash_table,无论是 数字索引数组array(1, 2, 3) 还是关联数组array(1 => 2, 2=> 4)等等. 一,这里的hash_table有几 ...

  9. nginx负载均衡配合keepalived服务案例实战

    本实验用4台 centos6 虚拟机,2台做负载均衡,2台做web服务器,都先装上nginx lb01:192.168.0.235  --主负载均衡器 lb02:192.168.0.236  --备负 ...

  10. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...