作者: IT小样
之前学习的python都是很零散的,没有系统找书来看,最近入手Python核心编程一书,打算好好看一下自己会用到的一些模块,并在阅读后写下自己的心得,是总结也方便自己以后回顾。首当其冲就是正则表达式啦!
正则表达式进行匹配时,采取的是贪婪匹配法,即尽可能多的匹配。以符号来说,它代表匹配0次或多次,正则表达式为he*,字符串为heeeeeeeee,则匹配结果为整个字符串。
如果想要采取非贪婪匹配法,则在重复性字符后加上?,这表示采用重复字符的最少匹配次数,?代表0次,+?代表1次,??代表0次,{M,N}代表M次。详细的字符串匹配见下表
常用正则表达式符号
表示法 | 描述 | 正则表达式实例 |
---|---|---|
literal | 匹配文本字串的字面值,所见即所得 | hello |
. | 匹配除\n外任意字符 | hel.o |
re1|re2 | 匹配模式re1或者re2 | hello|Hello |
^ | 表示字符串起始 | ^hello |
$ | 表示字符串结尾 | hello$ |
* | 表示前面的字符出现0次或多次 | he* |
+ | 表示前面的字符出现1次或多次 | he+ |
? | 表示前面的字符出现0次或1次 | he? |
{M} | 表示匹配M次前面出现的正则表达式 | he{M} |
{M,N} | 表示匹配M到N次前面出现的正则表达式 | he{M,N} |
[…] | 表示匹配来自字符集的任意一个字符 | [aeoiu] |
[…x-y…] | 表示匹配x-y范围中的任意一个字符 | [0-9A-Z] |
[^…] | 表示不匹配此字符集中的任意一个字符 | [^aeoiu] |
*? | 匹配0次(在重复匹配符号后加上?,表示匹配最少次数) | h.*? |
(…) | 匹配封闭的正则表达式,然后存为子组 | (h*)ello |
正则表达式特殊字符
表示法 | 描述 | 正则表达式实例 |
---|---|---|
\d | 匹配任意十进制数字与[0-9]一致,\D表示匹配任意非数值型数字 | hello\d+ |
\w | 匹配任意字母数字,\W与之相反 | Hello\w* |
\s | 匹配任何空格字符,\S与之相反 | hello\s? |
\b | 匹配任何单词边界,\B与之相反 | \bhello\b |
\N | 匹配已保存的子组N | price:\2 |
\c | 逐字匹配任何特殊字符c,按字面意思匹配,不匹配特殊含义 | \.,\\ |
\A(\Z) | 匹配字符串的起始(结束) | \Ahello |
此处解释一下分组(…),分组是把特定的正则表达式放在一起成为一个分组,一个正则表达式中可以有多个分组,比如:h(e\w+)\d(u[0-9])+,此正则表达式一共有两个分组,可以结合Python方法group(),groups()妙用,在下面会有讲解示例。
python正则表达式方法
正则表达式模块为re,需要掌握的方法有:match(),search()、group(),groups()方法
match()代表从首部开始匹配,search()表示从任意位置开始搜索匹配,group()输出完整匹配结果,如果跟上下标,则表示输出对应子组,如group(1)代表输出第一个匹配的子组,详见示例;groups()输出所有子组,若无子组,则输出为空。
import re
pattern1 = 'he\w+'
pattern2 = '(he\wc)_(p)'
str1 = 'helco_piw"
str2 = 'Hhelco piw'
re.match(pattern1,str1).group() #输出'helco'
re.match(pattern1,str2).group() #无输出,因为字首不匹配
re.search(pattern1,str2).group() #输出'helco',因为search从整个字符串中搜索
#分组示例,以及group()和groups()用法
result = re.match(pattern2,str1)
result.guoup() #输出'helco_p',输出的是完整匹配
result.group(1) #输出'helco'
result.group(2) #输出'p'
result.groups() #输出('helco','p')