没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
正则表达式 HOWTO
发布 3.8.1
Guido van Rossum
and the Python development team
二月 02, 2020
Python Software Foundation
Email: docs@python.org
Contents
1 概述 2
2 简单模式 2
2.1 匹配字符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2 重复 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 使用正则表达式 4
3.1 编译正则表达式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 反斜杠灾难 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.3 应用匹配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.4 模块级别函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.5 编译标志 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 更多模式能力 9
4.1 更多元字符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 分组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.3 非捕获和命名组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.4 前向断言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5 修改字符串 13
5.1 分割字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.2 搜索和替换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6 常见问题 15
6.1 使用字符串方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6.2 match() 和 search() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.3 贪婪与非贪婪 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
6.4 使用 re.VERBOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
7 反馈 17
作者 A.M. Kuchling <amk@amk.ca>
1
摘要
本文档是在 Python 中使用 re 模块使用正则表达式的入门教程。它提供了比“标准库参考”中相应部
分更平和的介绍。
1 概述
正则表达式(称为 RE,或正则,或正则表达式模式)本质上是嵌入在 Python 中的一种微小的、高度专业
化的编程语言,可通过 re 模块获得。使用这种小语言,你可以为要匹配的可能字符串集指定规则;此
集可能包含英语句子,电子邮件地址,TeX 命令或你喜欢的任何内容。然后,您可以询问诸如“此字符
串是否与模式匹配?”或“此字符串中的模式是否匹配?”等问题。你还可以使用正则修改字符串或以各
种方式将其拆分。
正则表达式模式被编译成一系列字节码,然后由用 C 编写的匹配引擎执行。对于高级用途,可能需要特
别注意引擎如何执行给定的正则,并将正则写入以某种方式生成运行速度更快的字节码。本文档未涉及
优化,因为它要求你充分了解匹配引擎的内部结构。
正则表达式语言相对较小且受限制,因此并非所有可能的字符串处理任务都可以使用正则表达式完成。
还有一些任务 可以用正则表达式完成,但表达式变得非常复杂。在这些情况下,你最好编写 Python 代码
来进行处理;虽然 Python 代码比精心设计的正则表达式慢,但它也可能更容易理解。
2 简单模式
我们首先要了解最简单的正则表达式。由于正则表达式用于对字符串进行操作,因此我们将从最常见的
任务开始:匹配字符。
有关正则表达式(确定性和非确定性有限自动机)的计算机科学的详细解释,你可以参考几乎所有有关
编写编译器的教科书。
2.1 匹配字符
大多数字母和字符只会匹配自己。例如,正则表达式 test 将完全匹配字符串 test 。(你可以启用一个
不区分大小写的模式,让这个正则匹配 Test 或 TEST,稍后会详细介绍。)
这条规则有例外;一些字符是特殊的 metacharacters ,并且不匹配自己。相反,它们表示应该匹配一些与
众不同的东西,或者通过重复它们或改变它们的含义来影响正则的其他部分。本文档的大部分内容都致
力于讨论各种元字符及其功能。
这是元字符的完整列表;它们的意思将在本 HOWTO 的其余部分讨论。
. ^ $ * + ? { } [ ] \ | ( )
我们将看到的第一个元字符是 [ 和 ] 。它们用于指定字符类,它是你希望匹配的一组字符。可以单独列
出字符,也可以通过给出两个字符并用 '-' 标记将它们分开来表示一系列字符。例如,[abc] 将匹配任
何字符 a、b 或 c ;这与 [a-c] 相同,它使用一个范围来表示同一组字符。如果你只想匹配小写字母,
你的正则是 [a-z] 。
字符类中的元字符不生效。例如,[akm$] 将匹配 'a' ,'k' 、'm' 或 '$' 中的任意字符;'$' 通常是
一个元字符,但在一个字符类中它被剥夺了特殊性。
你可以通过以下方式匹配 complementing 设置的字符类中未列出的字符。这通过包含一个 '^' 作为该类
的第一个字符来表示。例如,
[^5]
将匹配除
'5'
之外的任何字符。如果插入符出现在字符类的其他位
置,则它没有特殊含义。例如:[5^] 将匹配 '5' 或 '^'。
也许最重要的元字符是反斜杠,\。与 Python 字符串文字一样,反斜杠后面可以跟各种字符,以指示各
种特殊序列。它也用于转义所有元字符,因此您仍然可以在模式中匹配它们;例如,如果你需要匹配 [
或 \,你可以在它们前面加一个反斜杠来移除它们的特殊含义:\[ 或 \\。
2
一些以 '\' 开头的特殊序列表示通常有用的预定义字符集,例如数字集、字母集或任何非空格的集合。
让我们举一个例子:\w 匹配任何字母数字字符。如果正则表达式模式以字节类表示,这相当于类
[a-zA-Z0-9_]。如果正则表达式是一个字符串,\w 将匹配由 unicodedata 模块提供的 Unicode 数据
库中标记为字母的所有字符。通过在编译正则表达式时提供 re.ASCII 标志,可以在字符串模式中使用
更为受限制的 \w 定义。
以下特殊序列列表不完整。有关 Unicode 字符串模式的序列和扩展类定义的完整列表,请参阅标准库参
考中的最后一部分 正则表达式语法。通常,Unicode 版本匹配 Unicode 数据库中相应类别中的任何字符。
\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,.] 是一个匹配任何空格字符的字符类或者 ',' ,或 '.'。
本节的最后一个元字符是 . 。它匹配除换行符之外的任何内容,并且有一个可选模式(re.DOTALL )甚
至可以匹配换行符。. 常用于你想匹配“任何字符”的地方。
2.2 重复
能够匹配不同的字符集合是正则表达式可以做的第一件事,这对于字符串可用方法来说是不可能的。但
是,如果这是正则表达式的唯一额外功能,那么它们就不会有太大的优势。另一个功能是你可以指定正
则的某些部分必须重复一定次数。
重复中我们要了解的第一个元字符是 *。* 与字面字符 '*' 不匹配;相反,它指定前一个字符可以匹配
零次或多次,而不是恰好一次。
例如,ca*t 将匹配 'ct' (0 个 'a' 字符),'cat' (1 个 'a' ),'caaat' (3 个 'a' 字符),等等。
类似 * 这样的重复是 贪婪的;当重复正则时,匹配引擎将尝试尽可能多地重复它。如果模式的后续部分
不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。
一个逐步的例子将使这更加明显。让我们考虑表达式 a[bcd]*b。这个正则匹配字母 'a',类 [bcd] 中
的零或多个字母,最后以 'b' 结尾。现在想象一下这个正则与字符串 'abcbd' 匹配。
步骤 匹配 解释
1 a 正则中的 a 匹配。
2 abcbd 引擎尽可能多地匹配 [bcd]* ,直到字符串结束。
3 失败 引擎尝试匹配 b ,但是当前位置位于字符串结束,所以匹配失败。
4 abcb 回退一次,[bcd]* 少匹配一个字符。
5 失败 再次尝试匹配 b ,但是当前位置是最后一个字符 'd' 。
6 abc 再次回退,所以 [bcd]* 只匹配 bc 。
6 abcb 再试一次 b 。这次当前位置的字符是 'b' ,所以它成功了。
正则现在已经结束了,它已经匹配了 'abcb'。这演示了匹配引擎最初如何进行,如果没有找到匹配,它
将逐步回退并一次又一次地重试正则的其余部分。它将回退,直到它为 [bcd]* 尝试零匹配,如果随后
失败,引擎将断定该字符串与正则完全不匹配。
另一个重复的元字符是 +,它匹配一次或多次。要特别注意 * 和 + 之间的区别;* 匹配 零次或更多次,
因此重复的任何东西都可能根本不存在,而 + 至少需要 一次。使用类似的例子,ca+t 将匹配 'cat' (1
个 'a'),'caaat' (3 个 'a'),但不会匹配 'ct'。
还有两个重复限定符。问号字符 ? 匹配一次或零次;你可以把它想象成是可选的。例如,home-?brew
匹配 'homebrew' 或 'home-brew'。
3
剩余16页未读,继续阅读
资源评论
Corollary
- 粉丝: 29
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功