1.1 简介
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,Re模块是Regular expression operations的缩写,即正则表达操作,这个模块会提供正则表达匹配相关操作,其语法格式与Perl相近。
re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串作为它们的第一个参数。
1.2 正则表达式处理流程
在Python中,对正则表达式的支持是通过re模块来进行实现的。简单的来说使用re的一般步骤为:首先将正则表达式的字符串形式转换为模式(Pattern)对象,然后使用Pattern对象处理文本并获得相应的匹配结果(也就是一个Match对象),最后对Match对象使用相应的方法进行其他的操作。
1.3 正则表达式的语法规则
网上介绍正则表达式的内容很多。在这里不一一列举出来。我在这里总结一下自己的想法:
正则表达式是要匹配目标的字符串。正则表达式是由数字和符号集合构成的。元素集合是字符的。正则表达式就是要求规定字符出现+出现的次数 。
限定字符: 能够控制字符出现次数的有: {1,}、?、*、+
能够控制出现的字符的有: 元素集合,如[A-Za-z],、预定义符号,如:\w. \D \W 另外还有逻辑符号的特殊字符 ? | &
定位符:
^代表从字符串开始进行匹配
$代表匹配字符串的末尾
. 代表匹配任意一个字符
理解了这些基本知识以后,可以对以上进行任意的组合.
例如:
.+ 代表 匹配任意1个以上的字符
.{2,}代表匹配任意两个以上的字符
[^0-9] 代表匹配除了数字以外的一个字符
基本的语法规则掌握号以后,后期可以逐步提高。
1.3 Re模块中基本的函数使用
在Python中,对正则表达式的支持是通过re模块来进行实现的。简单的来说使用re的一般步骤为:首先将正则表达式的字符串形式转换为模式(Pattern)对象,然后使用Pattern对象处理文本并获得相应的匹配结果(也就是一个Match对象),最后对Match对象使用相应的方法进行其他的操作。
Re常见函数:
re.compile(pattern,flags=0)
该函数将字符创pattern编译成正则对象(regular
expression object)
参数pattern是正则表达式; flags是预定义的int常量。
flags有很多可选值:
re.I(IGNORECASE) : 忽略大小写,括号内是完整的写法
re.M(MULTILINE): 多行模式,改变^和$的行为
re.S(DOTALL) : 点可以匹配任意字符,包括换行符
re.L(LOCALE) : 做本地化识别的匹配,不推荐使用
re.U(UNICODE) : 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag,U=0
re.X(VERBOSE) 冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
re.A/re.ASCII: 仅执行8位的ASCII码字符匹配
re.DEBUG: 查看正则表达式的匹配过程
函数会返回Pattern对象
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造。
Pattern提供了几个可读属性用于获取表达式的相关信息:
pattern: 编译时用的表达式字符串。
flags: 编译时用的匹配模式,前面已经说过。
groups: 表达式中分组的数量。
groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
re.search(pattern,string,flags=0) 返回match对象
扫描整个字符string串寻找第一个匹配正则表达式pattern的位置,每找到一个就产生一个match,同时产生match 对象。如果这个对象是None说明匹配不成功。注意 :这与string的search返回不同.string.search()返回的是int,代表匹配的成功的第一个字符的位置position
re.match(pattern,string,flags=0) 同pattern.match()
从String开始就匹配,如果match成功返回match 对象,否则返回none
match与search的区别:
match是从都开始匹配,相当于search里面的pattern添加了^
match只能头开始匹配,无论参数是如何变幻
详见:
https://docs.python.org/3.6/library/re.html#search-vs-match
re.split(pattern,string,maxsplit=0,flags=0) 返回match对象
Match Object
Match.group([group1,...])
用于存储所匹配的字符
参考资料
1. Welcome to Regular-Expressions.info The Premier website about Regular Expressions
4. 进阶正则表达式
5. Python Regular Expression Tutorial
6. 6.2. re — Regular expression operations
7. 《精通正则表达式》
8. 《正则表达式必知必会》(2007年,人民邮电出版社)
9. https://docs.python.org/3.6/library/re.html#contents-of-module-re
1.4 问题
Python 的正则表达式字符串为什么要加 r 呢?
提示:python 中的正则表达式文本前面需要添加字母r, 这是为什么呢?如果去掉r 又会如何呢?
不加r也是可以使用的。使用re.compile(r'h\w+')是有一定原因的:
r 是英文单词raw的缩写。
我们都知道字符都是有编码的,我们常见的编码有很多,这些编码之间如果直接转换会出现乱码问题,同时也会造成无法匹配。举个例子,假如正则表达式的文本是Unicode编码,而要匹配的文本是GBK,那么匹配过程中可能无法达到预期的效果。也就是说,无法将Unicode字符串与字节模式匹配,反之亦然;同样,当要求替换时,替换字符串必须与模式和搜索字符串的类型相同。所以尽量 raw字符串比配。
其次,正则表达式使用反斜线字符('\')来表示特殊形式或允许使用特殊字符而不用调用其特殊含义。这与Python在字符串文字中用于相同目的的相同字符的使用相冲突;例如,要匹配文字反斜线,可能必须将'\\\\'写为模式字符串,因为正则表达式必须是\\,并且每个反斜杠必须在常规Python字符串文本内表示为\\。
这样写起来会很麻烦的,不是么?
解决方案是将Python的原始字符串表示法用于正则表达式模式;在以'r'为前缀的字符串文字中不以任何特殊方式处理反斜杠。所以r“\ n”是包含'\'和'n'的两个字符的字符串,而“\ n”是包含换行符的单字符字符串。通常,Pattern将使用此原始(raw)字符串表示法以Python代码表示。
总结:
1. 从第一个字符开始匹配,应该使用match 方法
2. 当不需要从第一个字节开始匹配,而是寻找匹配成功的字符串,这种情况可以使用search
1.5 正则表达式的历史
小故事:正则表达式的起源
一位数学家的出现
正则表达式的起源可以追溯到1951年,当时蒂芬科尔克莱恩(Stephen Cole Kleene)开始采用他的数学符号来表述常规语言,后来这些数学符号在被称作正则集合(regular sets)。
但当时仅仅是一种表达手段,并没有流行起来。
一位程序员的出现
正则表达式从1968年开始流行使用,当时的用途主要有两种:在文本编辑器中匹配文本,在编辑器中分析词法。而让正则表达式第一次以编程形式的是肯·汤普森(Ken Thompson ,Kenneth Thompson)。肯•汤普森是一位具有传奇色彩的程序员,在维基百科翻看他的履历,你为他在计算机领域做出的贡献而赞叹不已:他是Unix的设计者和创造者之一;他是Go语言的发明者,早期文本编辑器QED和ed的发明者;他定义了UTF-8编码;他首次实现了正则表达式。当时,汤普森在开发一种编辑器—QED,并将这些符号作为匹配文本文件中的模式的手段。为了提高速度,汤普森在一台装有兼容时间共享系统的IBM 7094机器上实现了正则表达式的功能。后来他将这个功能添加到Unix编辑器中,最终导致了流行的搜索工具grep使用正则表达式。Linux系统中用grep命令来实现正则表达。“grep”是从编辑器中正则表达式搜索命令派生的一个词,g / re / p的含义是“全局搜索正则表达式和打印匹配行(Global search forRegularExpression andPrint matching lines)”。
今天,正则表达式在编程语言,文本处理程序(特别是词法分析器),高级文本编辑器和其他一些程序中得到广泛支持。正则表达式支持是许多编程语言(包括Java和Python)的标准库的一部分,并且构建在其他语言的语法中,包括Perl和ECMAScript。对于实现了正则表达式功能的通常被称为正则表达式引擎,并为可供许多库重用。