Python正则表达式操作的指南

上传人:枫** 文档编号:506379587 上传时间:2023-03-02 格式:DOC 页数:29 大小:317KB
返回 下载 相关 举报
Python正则表达式操作的指南_第1页
第1页 / 共29页
Python正则表达式操作的指南_第2页
第2页 / 共29页
Python正则表达式操作的指南_第3页
第3页 / 共29页
Python正则表达式操作的指南_第4页
第4页 / 共29页
Python正则表达式操作的指南_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Python正则表达式操作的指南》由会员分享,可在线阅读,更多相关《Python正则表达式操作的指南(29页珍藏版)》请在金锄头文库上搜索。

1、Python正则表达式操作指南原文岀处.amk.ca/python/howto/regex/原文作者A.M. Kuchling(amkamk.ca)授权许可:创作共享协议翻译人员FireHare校对人员Leal适用版本:Python 1.5及后续版本摘要本文是通过Python的re模块来使用正则表达式的一个入门教程,和库参考手册的对应章节相比,更为浅 显易懂、循序渐进。本文可以从 .amk.ca/python/howto捕获目录目录隐藏?1简介?2简单模式o 2.1字符匹配o 2.2重复?3使用正则表达式o 3.1编译正则表 达式o 3.2反斜杠的麻 烦o 3.3执行匹配o 3.4模块级函数o

2、 3.5编译标志?4更多模式功能o 4.1更多的元字符o 4.2分组o 4.3无捕获组和 命名组o 4.4前向界定符?5修改字符串o 5.1将字符串分 片o 5.2搜索和替换?6常见问题o 6.1使用字符串 方式o6.2 match() vssearch。o6.3贪婪 vs不贪婪o 6.4 不 用 re.VERBOSE?7反馈?8关于本文档编辑简介Python自1.5版本起增加了 re模块,它提供 Perl风格的正则表达式模式。 Python 1.5之前版本则是通过 regex模块提供Emacs风格的模式。Emacs风格模式可读性稍差些, 而且功能也不强,因此编写新代码时 尽量不要再使用reg

3、ex模块,当然偶尔你还是可能在老代码里发现其踪影。就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的编程语言,(在Python中)它嵌在Python 中,并通过re模块实现。使用这个小型语言,你可以为想要匹配的相应字符串集指定规则;该字符串集 可能包含英文语句、地址、 TeX命令或任何你想搞定的东西。然后你可以问诸如这个字符串匹配该模式吗? ”或在这个字符串中是否有部分匹配该模式呢?”你也可以使用 RE以各种方式来修改或分割字符串。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。在高级用法中,也许还要仔细留意引擎是如何执行给定RE,如何以特定方式编写 RE以令生产

4、的字节码运行速度更快。本文并不涉及优化,因为那要求你已充分掌握了匹配引擎的部机制。正则表达式语言相对小型和受限(功能有限),因此并非所有字符串处理都能用正则表达式完成。当然也有Python代码进些任务可以用正则表达式完成,不过最终表达式会变得异常复杂。碰到这些情形时,编写 行处理可能反而更好;尽管Python代码比一个精巧的正则表达式要慢些,但它更易理解。编辑简单模式我们将从最简单的正则表达式学习开始。由于正则表达式常用于字符串操作,那我们就从最常见的任务: 字符匹配下手。有关正则表达式底层的计算机科学上的详细解释(确定性和非确定性有限自动机),你可以查阅编写编译器相关的任何教科书。字符匹配大

5、多数字母和字符一般都会和自身匹配。例如,正则表达式test会和字符串“test完全匹配。(你也可以使用大小写不敏感模式,它还能让这个RE匹配“Test或“TEST;稍后会有更多解释。)这个规则当然会有例外; 有些字符比较特殊,它们和自身并不匹配,而是会表明应和一些特殊的东西匹配,或者它们会影响到 RE其它部分的重复次数。本文很大篇幅专门讨论了各种元字符及其作用。这里有一个元字符的完整列表;其含义会在本指南馀下部分进行讨论。.A $ * + ? I ()IIII我们首先考察的元字符是和。它们常用来指定一个字符类别,所谓字符类别就是你想匹配的一个字 符集。字符可以单个列出,也可以用-”号分隔的两个

6、给定字符来表示一个字符区间。例如,abc将匹配a, b,或c中的任意一个字符;也可以用区间a-c来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那么RE应写成a-z.元字符在类别里并不起作用。例如,akm$将匹配字符a, k, m,或$中的任意一个;$通常用作元字符,但在字符类别里,其特性被除去,恢复成普通字符。你可以用补集来匹配不在区间围的字符。其做法是把人作为类别的首个字符;其它地方的人只会简单匹配A字符本身。例如,A5将匹配除5之外的任意字符。也许最重要的元字符是反斜杠 。做为Python中的字符串字母,反斜杠后面可以加不同的字符以表示不 同特殊意义。它也可以用于取消所有的元字

7、符,这样你就可以在模式中匹配它们了。举个例子,如果你需 要匹配字符”或,你可以在它们之前用反斜杠来取消它们的特殊意义:或。一些用开始的特殊字符所表示的预定义字符集通常是很有用的,象数字集,字母集,或其它非空字符 集。下列是可用的预设特殊字符:d匹配任何十进制数;它相当于类0-9。D匹配任何非数字字符;它相当于类A0-9。s匹配任何空白字符;它相当于类tnrfv。S匹配任何非空白字符;它相当于类a tnrfvw 匹配任何字母数字字符;它相当于类 a-zA-Z0-9_。IIW 匹配任何非字母数字字符;它相当于类Aa-zA-Z0-9_这样特殊字符都可以包含在一个字符类中。如,s,.字符类将匹配任何空

8、白字符或,或.。本节最后一个元字符是.。它匹配除了换行字符外的任何字符,在alternate模式(re.DOTALL)下它甚至可以匹配换行。.通常被用于你想匹配任何字符”的地方。编辑重复正则表达式第一件能做的事是能够匹配不定长的字符集,而这是其它能作用在字符串上的方法所不能做到 的。不过,如果那是正则表达式唯一的附加功能的话,那么它们也就不那么优秀了。它们的另一个功能就 是你可以指定正则表达式的一部分的重复次数。我们讨论的第一个重复功能的元字符是*。*并不匹配字母字符*;相反,它指定前一个字符可以被匹配零次或更多次,而不是只有一次。举个例子,ca*t将匹配ct (0个a字符),cat (1个a

9、), caaat (3 个a字符)等等。RE引擎有各 种来自C的整数类型大小的部限制,以防止它匹配超过2亿个a字符;你也许没有足够的存去建造那么大的字符串,所以将不会累计到那个限制。象*这样地重复是 贪婪的”当重复一个 RE时,匹配引擎会试着重复尽可能多的次数。如果模式的后 面部分没有被匹配,匹配引擎将退回并再次尝试更小的重复。一步步的示例可以使它更加清晰。让我们考虑表达式 abcd*b。它匹配字母a,零个或更多个来自类 bed中的字母,最后以 b结尾。现在想一想该RE对字符串abcbd的匹配。StePMatchedExplanation1aa匹配模式2abcbd引擎匹配bcd*,并尽其所能匹

10、配到字符串的结尾3Failure引擎尝试匹配 b,但当前位置已经是字符的最后了,所以失败4abcb退回,bcd*尝试少匹配一个字符。5Failure再次尝次b,但在当前最后一位字符是d。6abc再次退回,bcd*只匹配be。7abcb再次尝试b,这次当前位上的字符正好是bRE的结尾部分现在可以到达了,它匹配abcb。这证明了匹配引擎一开始会尽其所能进行匹配,如果没有匹配然后就逐步退回并反复尝试RE剩下来的部分。直到它退回尝试匹配bcd到零次为止,如果随后还是失败,那么引擎就会认为该字符串根本无法匹配RE。另一个重复元字符是 +,表示匹配一或更多次。请注意*和+之间的不同;*匹配零或更多次,所以

11、根本就可以不出现,而+则要求至少出现一次。用同一个例子,ca+t就可以匹配cat (1个a), caaat(3个a),但不能匹配 ct。还有更多的限定符。问号?匹配一次或零次;你可以认为它用于标识某事物是可选的。例如:home-?brew匹配己homebrew或home-brew。最复杂的重复限定符是 m,n,其中m和n是十进制整数。该限定符的意思是至少有m个重复,至多至U n个重复。举个例子,a/1,3b将匹配a/b,a/b和a/b。它不能匹配ab因为没有斜杠,也不 能匹配a/b,因为有四个。你可以忽略 m或n;因为会为缺失的值假设一个合理的值。忽略m会认为下边界是 0,而忽略n的结果将是上

12、边界为无穷大-实际上是先前我们提到的2 兆,但这也许同无穷大一样。细心的读者也许注意到其他三个限定符都可以用这样方式来表示。0,等同于* ,1,等同于+,而0,1则与?相同。如果可以的话,最好使用*,+,或?。很简单因为它们更短也再容易懂。编辑使用正则表达式现在我们已经看了一些简单的正则表达式,那么我们实际在 Python中是如何使用它们的呢?re模块提供了一个正则表达式引擎的接口,可以让你将REs编译成对象并用它们来进行匹配。编辑编译正则表达式正则表达式被编译成RegexObject实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。iIII#!pythonIIII import r

13、eIIiIII p = pile(ab*)IIII print pIIIvre.RegexObject instance at 80b4150IIIIII:IIIIIIpile()也接受可选的标志参数,常用来实现不同的特殊功能和语法变更。我们稍后将查看所有可用的设置,但现在只举一个例子:IjIIII#!pythonIIIIIII p =pile(ab*, re.IGNORECASE)IIIIIIIIIIL RE被做为一个字符串发送给pile()。REs被处理成字符串是因为正则表达式不是Python语言的核心部分,也没有为它创建特定的语法。(应用程序根本就不需要REs,因此没必要包含它们去使语言

14、说明变得臃肿不堪。)而re模块则只是以一个 C扩展模块的形式来被Python包含,就象socket或zlib模块一样将REs作为字符串以保证 Python语言的简洁,但这样带来的一个麻烦就是象下节标题所讲的。编辑反斜杠的麻烦在早期规定中,正则表达式用反斜杠字符()来表示特殊格式或允许使用特殊字符而不调用它的特殊用法。这就与 Python在字符串中的那些起相同作用的相同字符产生了冲突。让我们举例说明,你想写一个RE以匹配字符串section,可能是在一个 LATEX文件查找。为了要在程序代码中判断,首先要写岀想要匹配的字符串。接下来你需要在所有反斜杠和元字符前加反斜杠来取消 其特殊意义。字符阶段section

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号