Python之正则表达式

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。

二、正则表达式的发展史

正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创造性地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。

在1951 年,一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。

之后一段时间,人们发现可以将这一工作成果应用于其他方面。Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。Jeffrey Friedl 在其著作《Mastering Regular Expressions (2nd edition)》(中文版译作:精通正则表达式,已出到第三版)中对此作了进一步阐述讲解,如果你希望更多了解正则表达式理论和历史,推荐你看看这本书。

自此以后,正则表达式被广泛地应用到各种UNIX或类似于UNIX的工具中,如大家熟知的Perl。Perl的正则表达式源自于Henry Spencer编写的regex,之后已演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),pcre是一个由Philip Hazel开发的、为很多现代工具所使用的库。正则表达式的第一个实用应用程序即为Unix中的 qed 编辑器。

然后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展,演变成为计算机技术森林中的一只形神美丽且声音动听的百灵鸟。

以上是关于正则表达式的起源和发展的历史描述,如今正则表达式在基于文本的编辑器和搜索工具中依然占据着一个非常重要的地位。

在最近的六十年中,正则表达式逐渐从模糊而深奥的数学概念,发展成为在计算机各类工具和软件包应用中的主要功能。不仅仅众多UNIX工具支持正则表达式,近二十年来,在WINDOWS的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!从正则式在Microsoft Visual Basic 6 或 Microsoft VBScript到.NET Framework中的探索和发展,WINDOWS系列产品对正则表达式的支持发展到无与伦比的高度,几乎所有 Microsoft 开发者和所有.NET语言都可以使用正则表达式。如果你是一位接触计算机语言的工作者,那么你会在主流操作系统(*nix[Linux, Unix等]、Windows、HP、BeOS等)、主流的开发语言(delphi、Scala、PHP、C#、Java、C++、Objective-c、Swift、VB、Javascript、Ruby以及Python等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。

三、正则表达式符号

字符串                        匹配字符串的值                         
re1|re2                      匹配正则表达式re1或re2                  
.                            匹配任何字符(换行符除外)                
^                            匹配字符串的开始                   
$                            匹配字符串的结尾
*                            匹配前面出现的正则表达式零
+                            匹配前面出现的正则表达式一次或多次
?                            匹配前面出现正则表达式零次或一次
{N}                          匹配前面出现的正则表达式N次
{M,N}                        匹配重复出现M次到N次正则表达式
[...]                        匹配字符组里出现的任意一个字符
[x-y]                        匹配从字符x到y中的任意一个字符
[^...]                       不匹配字符集中出现的任何一个字符
(...)                        匹配封闭括号中正则表达式(RE),并保存为子组
\d                           匹配任何数字,和[0-9]一样(\D是\d的反义:任何非数字)
\w                           匹配任何数字字母字符,和[A-Za-z0-9]相同
\s                           匹配任何空白字符
\b                           匹配单词边界
\c                           匹配特殊字符
\A(\Z)                       匹配字符串的起始(结束)

四、正则表达式匹配举例

正则表达式模式                匹配的字符串

at|home                     at,home
r2d2|c3po                   r2d2,c3po
f.o                         fao,f9o等
..                          aa,bb,ab等任意两个字符
\.doc                       .doc
^From                       匹配任何以From开始的字符串
/bin/tcsh$                  匹配以/bin/tcsh结束的字符串
^Subject:hi$                匹配仅由Subject:hi组成字符串
the                         任何包含"the"匹配的字符串
\b the                      任何以"the"开始的字符串
\b the \b                   仅匹配单词"the"
\B the                      任意包含"the",但不以"the"开头的单词
b[aeiu]t                    bat,bet,bit,but
[cr][23][dp][o2]            一个包含4个字符的字符串:第一个字符是"r"或"c",后面是"2"或"3",再接下来是"d"或"p",最后是"o"或"2",例如:c2do,r3p2,r2d2,c3po等等。
[r-u][env-y][us]            “r”“s,”“t” 或 “u” 中的任意一个字符,后面跟的是 “e,” “n,” “v,” “w,” “x,” 或 “y”中的任意一个字符,再后面 是字符“u” 或 “s”. 
[^aeiou]                   一个非元音字符 [^\t\n] 除 TAB 制表符和换行符以外的任意一个字符 \w+@\w+\.com 简单的 XXX@YYY.com 格式的电子邮件地址 \d+(\.\d*)? 浮点数 匹配:0.004,”“2.”“75.”