教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 高中教育 >

Python正则表达式操作指南

来源:网络收集 时间:2026-09-07
导读: Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块,当然偶尔你还是可能在老代码里

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块,当然偶尔你还是可能在老代码里发现其踪影。

Python正则表达式操作指南

简介

Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。Python1.5之前版本则是通过regex模块提供Emacs风格的模式。Emacs风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用regex模块,当然偶尔你还是可能在老代码里发现其踪影。

就其本质而言,正则表达式(或RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过re模块实现。使用这个小型语言,你可以为想要匹配的相应字符串集指定规则;该字符串集可能包含英文语句、e-mail地址、TeX命令或任何你想搞定的东西。然后你可以问诸如“这个字符串匹配该模式吗?”或“在这个字符串中是否有部分匹配该模式呢?”。你也可以使用RE以各种方式来修改或分割字符串。

正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。在高级用法中,也许还要仔细留意引擎是如何执行给定RE,如何以特定方式编写RE以令生产的字节码运行速度更快。本文并不涉及优化,因为那要求你已充分掌握了匹配引擎的内部机制。正则表达式语言相对小型和受限(功能有限),因此并非所有字符串处理都能用正则表达式完成。当然也有些任务可以用正则表达式完成,不过最终表达式会变得异常复杂。碰到这些情形时,编写Python代码进行处理可能反而更好;尽管Python代码比一个精巧的正则表达式要慢些,但它更易理解。

简单模式

我们将从最简单的正则表达式学习开始。由于正则表达式常用于字符串操作,那我们就从最常见的任务:字符匹配下手。

有关正则表达式底层的计算机科学上的详细解释(确定性和非确定性有限自动机),你可以查阅编写编译器相关的任何教科书。

字符匹配

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

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块,当然偶尔你还是可能在老代码里发现其踪影。

这个规则当然会有例外;有些字符比较特殊,它们和自身并不匹配,而是会表明应和一些特殊的东西匹配,或者它们会影响到RE其它部分的重复次数。本文很大篇幅专门讨论了各种元字符及其作用。

这里有一个元字符的完整列表;其含义会在本指南余下部分进行讨论。

.^$*+?{[]\|()

我们首先考察的元字符是"["和"]"。它们常用来指定一个字符类别,所谓字符类别就是你想匹配的一个字符集。字符可以单个列出,也可以用“-”号分隔的两个给定字符来表示一个字符区间。例如,[abc]将匹配"a","b",或"c"中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那么RE应写成[a-z].

元字符在类别里并不起作用。例如,[akm$]将匹配字符"a","k","m",或"$"中的任意一个;"$"通常用作元字符,但在字符类别里,其特性被除去,恢复成普通字符。

你可以用补集来匹配不在区间范围内的字符。其做法是把"^"作为类别的首个字符;其它地方的"^"只会简单匹配"^"字符本身。例如,[^5]将匹配除"5"之外的任意字符。

也许最重要的元字符是反斜杠"\"。做为Python中的字符串字母,反斜杠后面可以加不同的字符以表示不同特殊意义。它也可以用于取消所有的元字符,这样你就可以在模式中匹配它们了。举个例子,如果你需要匹配字符"["或"\",你可以在它们之前用反斜杠来取消它们的特殊意义:\[或\\。

一些用"\"开始的特殊字符所表示的预定义字符集通常是很有用的,象数字集,字母集,或其它非空字符集。下列是可用的预设特殊字符:

\d匹配任何十进制数;它相当于类[0-9]。

\D匹配任何非数字字符;它相当于类[^0-9]。

\s匹配任何空白字符;它相当于类[\t\n\r\f\v]。

\S匹配任何非空白字符;它相当于类[^\t\n\r\f\v]。

\w匹配任何字母数字字符;它相当于类[a-zA-Z0-9_]。

\W匹配任何非字母数字字符;它相当于类[^a-zA-Z0-9_]。

这样特殊字符都可以包含在一个字符类中。如,[\s,.]字符类将匹配任何空白字符或","或"."。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块,当然偶尔你还是可能在老代码里发现其踪影。

本节最后一个元字符是.。它匹配除了换行字符外的任何字符,在alternate模式(re.DOTALL)下它甚至可以匹配换行。"."通常被用于你想匹配“任何字符”的地方。重复

正则表达式第一件能做的事是能够匹配不定长的字符集,而这是其它能作用在字符串上的方法所不能做到的。不过,如果那是正则表达式唯一的附加功能的话,那么它们也就不那么优秀了。它们的另一个功能就是你可以指定正则表达式的一部分的重复次数。

我们讨论的第一个重复功能的元字符是*。*并不匹配字母字符"*";相反,它指定前一个字符可以被匹配零次或更多次,而不是只有一次。

举个例子,ca*t将匹配"ct"(0个"a"字符),"cat"(1个"a"),"caaat"(3个"a"字符)等等。RE引擎有各种来自C的整数类型大小的内部限制,以防止它匹配超过20亿个"a"字符;你也许没有足够的内存去建造那么大的字符串,所以将不会累计到那个限制。

象*这样地重复是“贪婪的”;当重复一个RE时,匹配引擎会试着重复尽可能多的次数。如果模式的后面部分没有被匹配,匹配引擎将退回并再次尝试更小的重复。

一步步的示例可以使它更加清晰。让我们考虑表达式a[bcd]*b。它匹配字母"a",零个或更多个来自类[bcd]中的字母,最后以"b"结尾。现在想一想该RE对字符串"abcbd"的匹配。Step

1

2

3

4

5

6

7MatchedaabcbdFailureabcbFailureabcabcbExplanationa匹配模式引擎匹配[bcd]*,并尽其所能匹配到字符串的结尾引擎尝试匹配b,但当前位置已经是字符的最后了,所以失败退回,[bcd]*尝试少匹配一个字符。再次尝次b,但在当前最后一位字符是"d"。再次退回,[bcd]*只匹配"bc"。再次尝试b,这次当前位上的字符正好是"b"

RE的结尾部分现在可以到达了,它匹配"abcb"。这证明了匹配引擎一开始会尽其所能进行匹配,如果没有匹配然后就逐步退回并反复尝试RE剩下 …… 此处隐藏:13554字,全部文档内容请下载后查看。喜欢就下载吧 ……

Python正则表达式操作指南.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1729998.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)