Python正则表达式指南
Python3(2):正则表达式与Python(RE)模块
原文:https://zhuanlan.zhihu.com/p/39365124
http://www.cnblogs.com/yyds/p/6953348.html
一、re 模块介绍
Python 通过使用 re 模块来支持支持 Perl (Perl 5 )风格的正则表达式。Python中的re模块提供正则表达式的引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操作。re模块为这些操作分别提供了模块级别的函数以及相关类的封装。
1、re模块提供的类
Python中的re模块中最重要的两个类:
Regular Expression Objects:正则表达式对象,用于执行正则表达式相关操作的实体
Match Objects:正则表达式匹配对象,用于存放正则表达式匹配的结果并提供用于获取相关匹配结果的方法
1.1 正则表达式对象中的方法和属性
通过re模块的compile()函数编译得到的正则表达式对象(下面用regex表示)支持如下方法:
参数说明:
- string: 要匹配或处理的字符串
- pos: 可选参数,表示从string字符串的哪个位置开始,相当于先对字符串做切片处理string[pos:]
- endpos: 可选参数,表示到string字符串的哪个位置结束(不包含该位置)
- maxsplit: regex.split()方法的可选参数,表示最大切割次数;默认值为0,表示能切割多少次就尽可能多的切割多少次
- count: regex.sub()和regex.subn()方法的可选参数,表示最大替换次数;默认为0,表示能替换多少次就尽可能多的替换多少次
- repl: sub和subn函数中的repl表示replacement,用于指定将匹配到的子串替换成什么内容,需要说明的是该参数的值可以是一个字符串,也可以是一个函数
说明: 如果指定了pos和endpos参数,就相当于在进行正则处理之前先对字符串做切片操作 string[pos, endpos],如regex.search(string, 5, 50)就等价于regex.search(string[5:50]),也等价于regex.search(string[:50], 5);如果endpos比pos的值小,则不会找到任何匹配。
1.2 正则表达式匹配对象的方法和属性
调用正则表达式对象的regex.match()、regex.fullmatch()和regex.search()得到的结果就是一个正则表达式匹配对象,正则表达式匹配对象支持以下方法和属性:
参数说明:
- template: match.expand()方法中的template参数是一个模板字符串,这个字符串中可以使用分组对应的的数值索引进行后向引用(如:\1,\2)或命名后向引用(如\g<1>,\g<NAME>)来表示某个分组的占位符;match.expand()方法的执行过程实际上就是通过sub()方法把template字符串中的这些分组占位符用当前匹配对象中的数据进行替换。
- default: match.groups()与match.groupdict()方法中的default都是为未匹配成功的捕获组提供默认匹配值的。
- group: match.group()、match.start()、match.end()和match.span()方法中的group参数都表示要选择的分组索引值,1表示第一个分组,2表示第二个分组,依次类推,group参数的默认值是0,表示整个正则表达式所匹配的内容。
二、re模块提供的函数
1、re模块提供了以下几个模块级别的函数
- pattern:只能是字符串
- string: 需要用正则表达式来匹配的字符串对象
- flags: 一个标志位,它会影响正则表达式对象的匹配行为,可取值下面会介绍;但是有一点需要说明的是,只有当pattern参数是字符串时才能指定这个flags参数,否则会报错;如果pattren参数是一个正则表达式对象,则flags参数需要在调用re.compile()函数时指定。
- repl: sub和subn函数中的repl表示replacement,用于指定将匹配到的子串替换成什么内容,需要说明的是该参数的值可以是一个字符串,也可以是一个函数
- count: sub和subn函数中的count表示最多可替换次数
- maxsplit: split函数中的maxsplit蚕食表示最大分隔次数
说明: 通过对比会发现,上面这些re模块级别的函数除了re.compile、re.purge和re.escape这几个函数外,其它函数名都与正则表达式对象支持的方法同名。实际上re模块的这些函数都是对正则表达式对象相应方法的封装而已,功能是相同的。只是少了对pos和endpos参数的支持,但是我们可以手动通过字符串切片的方式来达到相应的需求。我们应该尽可能的使用模块级别的函数,这样可以增强代码的兼容性。
2.、标志位flags
flags参数在上面这些模块函数中是要个可选参数,re模块中预定了该参数可取的值:
说明: 这些flag可以单独使用,也可以通过逻辑或操作符'|'进行拼接来联合使用
三、使用re模块的步骤
1、使用re模块进行正则匹配操作的步骤
- 1)编写表示正则表达式规则的Python字符串str;
- 2)通过re.compile()函数编译该Python字符串获得一个正则表达式对象(Pattern Object)p;
- 3)通过正则表达式对象的p.match()或p.fullmatch()函数获取匹配结果--匹配对象(Match Object)m;
- 4)通过判断匹配对象m是否为空可知是否匹配成功,也可以通过匹配对象m提供的方法获取匹配内容。
2、 使用re模块进行内容查找、替换和字符串分隔操作的步骤
- 1)编写表示正则表达式规则的Python字符串str;
- 2)通过re.compile()函数编译该Python字符串获得一个正则表达式对象(Pattern Object)p;
- 3)通过正则表达式对象的p.search()或p.findall()或p.finditer()或p.sub()或p.subn()或p.split()函数完内容查找、替换和字符串分隔操作并获取相应的操作结果;
四、正则表达式字符串前的r前缀
编写一个表示正则表达式规则的Python字符串,那么正则表达式与Python字符串之间是什么关系呢?另外,我们通常都在一个正则表达式字符串前加上一个前缀r是何用意呢?
因为正则表达式并不是Python语言的核心部分(有些应用程序根本就不需要正则表达式,re模块就像socket或zlib一样,只是包含在Python中的一个简单的C语言扩展模块),也没有创建专门的语法来表示它们,所以在Python中正则表达式是以Python字符串的形式来编写并进行处理的。但是,我们应该知道的是字符串有 字符串的字面值(我们给一个字符串赋的值) 和 字符串的实际值(这个字符串的打印值),且正则表达式引擎把一个字符串作为正则表达式处理时,所取的是这个字符串的实际值,而不是它的字面值。
问题1:
字符串的字面值与字符串的实际值 不一定是等价的,因为有些字符组合起来表示的是一个特殊的符号,此时会导致正则表达式错误而无法匹配到想要的结果。比如:\1在正则表达式中表示引用第一个捕获组所匹配到的内容,而在字符串中却表示一个特殊的字符,因此如果一个表示正则表达式的字符串中包含"\1"且没有做任何处理的话,它是无法匹配到我们想要的结果的。如下图所示:
如果想要匹配正确结果就需要对该字符串中表示特殊字符的字符组合进行处理,我们只需要在'\1'前加一个反斜线对'\1'中的反斜线进行转义就可以了,即字符串"\1"的字面值才是\1。如下图所示:
也就是说,一个正则表达式要想用一个Python字符串来表示时,可能需要对这个字符串的字面值做一些特殊的转义处理。
问题2:
现在反过来考虑,\s在正则表达式中表示空白字符,如果我们想匹配一个字符串中'\s'这两个字符,就需要在正则表达式中\s前也加一个反斜线进行转义\\s
。那么这时候表示正则表达式的字符串同样不能直接写'\\s'
,因为它是字符串字面值,其实际值是\s,因此此时也是不能匹配到我们想要的结果的。如下图所示:
如果想要匹配正确结果就需要对该字符串进行一些处理,我们需要在'\\s'
前加两个反斜线对'\\s'
中的两个反斜线分别进行转义,即字符串"\\\\s"
的字面值才是\\s
。如下图所示:
字符串的r前缀
通过上面两个问题我们可以得出以下结论:
- 1)这些问题都是由于反斜线引起的,这种现象也被称为"反斜线瘟疫";
- 2)Python字符串与正则表达式都使用反斜线进行字符转义,正是由于这种冲突才引起了这些问题;
- 3)当一个正则表达式中又很多个反斜线要处理时,那无疑将是一种灾难。
怎么办呢?你只需要在表示正则表达式的字符串前加上一个前缀r就可以把这个字符串当然正则表达式来写了。 r是Raw,即“原始”的意思,带有r前缀的字符串就叫做“Raw String”,即原始字符串的意思。也就是说当一个字符串带有r前缀时,它的字面值就是其真实值,也就是正则表达式的值。
简单来说,表示正则表达式匹配规则的字符串前面的r前缀是为了解决字符串中的反斜线与正则表达式中的反斜线引起的冲突问题。我们根本无需关心哪些字符会引起这样的冲突,只需要在每个表示正则表达式的字符串前加上一个r前缀就可以了。
参考:
Python正则表达式指南 - AstralWind - 博客园Python之正则表达式(re模块) - 云游道士 - 博客园
《Core Python Applications Programming》(THIRD EDITION)人民邮电出版社 Wesley Chun(著)/孙波祥、李斌、李晗(译)
2016-6-1 ISBN:978-7-115-41477-9