第4章 正则表达式


1、简介

        正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。

        就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。使用这个小型语言,你可以为想要匹配的相应字符串集指定规则;该字符串集可能包含英文语句、e-mail地址、TeX命令或任何你想搞定的东西。然后你可以问诸如“这个字符串匹配该模式吗?”或“在这个字符串中是否有部分匹配该模式呢?”。你也可以使用 RE以各种方式来修改或分割字符串。
        正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。在高级用法中,也许还要仔细留意引擎是如何执行给定 RE ,如何以特定方式编写 RE 以令生产的字节码运行速度更快。本文并不涉及优化,因为那要求你已充分掌握了匹配引擎的内部机制。
        正则表达式语言相对小型和受限(功能有限),因此并非所有字符串处理都能用正则表达式完成。当然也有些任务可以用正则表达式完成,不过最终表达式会变得异常复杂。碰到这些情形时,编写 Python 代码进行处理可能反而更好;尽管 Python 代码比一个精巧的正则表达式要慢些,但它更易理解。

        使用正则表达式进行匹配的流程: 

2、字符匹配

     2.1 普通字符

        大多数字母和字符一般都会和自身匹配。例如,正则表达式 test 会和字符串“test”完全匹配。(你也可以使用大小写不敏感模式,它还能让这个 RE 匹配“Test”或“TEST”;稍后会有更多解释.)

     2.2 元字符

        这里有一个元字符的完整列表:

        下面逐一介绍:

        [ ]

        用于指定一个字符的集合。可以单独列出字符,也可以用'-'连接起止字符以表示一个范围。[abc] 将匹配“a”, “b”, 或 “c“中的任意一个字符,[a-z]匹配任意一个小写字母,[a-zA-Z0-9]匹配任意一个字母或数字。

        元字符在中括号里将失效,比如[akm$]就表示字符'a','k','m',或'$',在这里$也变身为普通字符了。

        你还可以对一个字符集合取反,以匹配任意不在这个字符集合里的字符,取反操作用一个“^”放在集合的最前面表示,放在其他地方的“^”将不会起特殊作用。例如[^5]将匹配任意不是“5”的字符;[^^]将匹配任意不是“^”的字符。

        ^

        匹配字符串开头,在多行模式中匹配每一行的开头。

        $

        匹配一个字符串的结尾或者字符串最后面的换行符,在多行模式下,也匹配每一行的行尾。

         \

        反斜杠后面可以加不同的字符以表示不同特殊意义。

        预定义字符集:

        这些特殊字符都可以包含在一个字符类中。如,

        也可以用于取消所有的元字符:\[或\\

        *

        指定匹配前一个字符0次或多次。

        +

        指定匹配前一个字符1次或多次。

        ?

        指定匹配前一个字符0次或1次。

        限制匹配的贪婪性:*?、+?、??、{}?

        { }

        {m,n}匹配前一个字符m至n次。m和n可以省略:若省略m,则匹配0至n次,若省略n,则匹配m至无限次。

        {0,}等同于*,{1,}等同于+,而{0,1}则与?相同。

         .

         匹配任意除换行符“\n”外的字符。在DOTALL模式中也能匹配换行符。

        |

        代表左右表达式任意匹配一个。

        非贪婪的,它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。



3、使用正则表达式

        re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用它们来进行匹配。

     3.1 编译正则表达式

        正则表达式被编译成 “RegexObject”实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。

        re.compile()也接受可选的标志参数,常用来实现不同的特殊功能和语法变更,因为compile是re模块方法,形式为:compile(pattern,flags=0)。

     3.2 反斜杠的麻烦

        在早期规定中,正则表达式用反斜杠字符 (“\”) 来表示特殊格式或允许使用特殊字符而不调用它的特殊用法。这就与 Python 在字符串中的那些起相同作用的相同字符产生了冲突。
        让我们举例说明,你想写一个RE以匹配字符串“\section”,可能是在一个LATEX文件查找。为了要在程序代码中判断,首先要写出想要匹配的字符串。接下来你需要在所有反斜杠和其它元字符前加反斜杠来取消其特殊意义,结果要匹配的字符串就成了"\\section"。 当把这个字符串传递给re.compile()时必须还是“\\section”。然而,作为Python的字符串实值(string literals)来表示的话,“\\section”中两个反斜杠还要再次取消特殊意义,最后结果就变成了“\\\\section”。

        简单地说,为了匹配一个反斜杠,不得不在RE字符串中写 “\\\\”,因为正则表达式中必须是“\\”,而每个反斜杠在常规的 Python字符串实值中必须表示成“\\”。在REs中反斜杠的这个重复特性会导致大量重复的反斜杠,而且所生成的字符串也很难懂。

        解决的办法就是为正则表达式使用Python的raw字符串表示;在字符串前加个“r”反斜杠就不会被任何特殊方式处理,所以r“\n” 就是包含“\”和“n”的两个字符,而“\n”则是一个字符,表示一个换行。正则表达式通常在Python代码中都是用这种raw字符串表示。

     3.3 执行匹配

        (1)RegexObject的方法和属性

一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?“RegexObject”实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Python Library Reference。

        如果没有匹配到的话,match()和 search()将返回None。如果成功的话,就会返回一个“MatchObject”实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。

        (2)MatchObject的方法和属性

        MatchObject 实例也有几个方法和属性;最重要的那些如下所示:

        在实际程序中,最常见的作法是将“MatchObject”保存在一个变量里,然后检查它是否为None,通常如下所示:

     3.4 模块级函数

        你不一定要产生一个“RegexObject”对象然后再调用它的方法;re模块也提供了顶级函数调用如match()、search()、sub()、subn()、split()、findall()、compile()等等。这些函数使用RE字符串作为第一个参数,而后面的参数则与相应“RegexObject”的方法参数相同,返回则要么是None要么就是一个“MatchObject”的实例。

     3.5 编译标志(flags

        编译标志让你可以修改正则表达式的一些运行方式。




参考文献

1、Python正则表达式操作指南

2、Python正则表达式

3、Python正则表达式——视频

4、Python正则表达式——深入浅出

5、Python正则表达式指南

6、Python正则表达式学习

7、Python中re模块学习


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值