python正则表达式模块re简介
re模块常用的一些功能有: re.match, re.compile, re.search, re.findall,re.finditer,re.sub, re.split
这里分别做简单的介绍,便于以后查询使用
1. re.match
re.match是re模块的一个基本方法,理解了该方法再去看其它方法便不难了
基本格式:
1 re.match(pattern, string, flags=0)
pattern是匹配模式,string是你要用正则表达式处理的字符串,flags是pattern和string匹配的方式。
什么是匹配模式呢,这得先说一下什么是正则表达式,个人理解,正则表达式就是你要以不同的“方法”去获取一个字符串内特定的信息。比如说,获取字符串某个位置(如首尾)的字符、某类数字或单词等等。而这个“方法”,就是匹配模式,也就是re.match里的pattern。匹配模式在不同平台上的格式还是比较统一的,python、java、bash语言里匹配模式区别并不大。
flags也叫做正则表达式修饰符,可通过设置不同的值来控制匹配方式,如是否区分大小写、是否多行匹配(默认非多行匹配)等。
那么re.match返回的是什么呢?如果pattern应用在string上没有匹配的内容,则返回none;反之,返回一个matchObject也即一个“匹配对象”, 我们可以使用group(matchObject)来获取相关匹配内容。例:
1 import re 2 obj = re.match('www', 'www.baidu.com.www') 3 obj.group() 4 5 # 输出 6 # 'www'
上述代码输出是'www',但是string内部有两处'www',为何只匹配一个?这里要特别说明一下,re.match是从左边第一个字符开始匹配的,所以只有在开头的'www'才能匹配到。那么如果要匹配的内容不在string的开头怎么办呢?这时就应该用到re.search
2. re.search
基本格式:
1 re.search(pattern, string, flags=0)
参数定义以及返回格式与re.match类似,唯一不同的点在于,匹配不一定从第一个字符开始,文中只要有匹配的内容即返回,例子如下:
1 import re 2 obj = re.search('www', 'baidu.com.www.baidu') 3 obj.group() 4 5 # 输出 6 # 'www'
3. re.compile
无论使用 match 还是 search,匹配模式和匹配修饰符往往是固定的,我们要做的一般都是把它们应用在不同的string上而已。那么每次重复的输入pattern和flag岂不是很蛮烦。re.compile可以比较好的解决这个问题。
基本格式:
1 re.compile(pattern, flags)
pattern 和 flags定义与match的类似,该函数返回一个模式对象。该模式对象可调用正则化匹配方法(如 match 和 search),配合string作为参数可以直接对string做match或者search操作。例:
1 import re 2 match_pattern = re.compile(pattern='www') 3 obj = match_pattern.search('baidu.com.www.baidu') 4 obj.group() 5 6 # 输出 7 # 'www'
4. re.findall
之前讨论过的match和search在匹配一次之后会立刻返回,但是如果需要找到所有的匹配内容的话,我们就需要用到findall。
基本格式:
1 # match_patttern为通过complie获取的匹配模式 2 match_pattern.findall(string, pos, endpos)
pos和endpos代表制定字符串扫描起始位置以及结束位置。 返回值为匹配成功的字符串片段列表,若无可匹配字段则返回空列表。例:
1 import re 2 match_pattern = re.compile(pattern='www') 3 match_list = match_pattern.findall('www.baidu.com.www.baidu') 4 print (match_list) 5 6 # 输出 7 # ['www', 'www']
5. re.finditer
re.findall返回的是匹配列表,但有时候我们考虑返回一个迭代对象(考虑到惰性计算,节省内存),这时候可以考虑使用re.finditer。其用法与参数与findall类似,只是返回的是一个迭代器。例:
1 import re 2 match_pattern = re.compile(pattern='www') 3 match_iter = match_pattern.finditer('www.baidu.com.www.baidu') 4 print (type(match_iter)) 5 for ele in match_iter: 6 # 元素需要调用group() 7 print (ele.group())
6. re.sub
在现实工程应用场景中,查找字符串匹配内容的目的往往在于替换它们,re提供了可以结合查找并替换匹配内容的方法:re.sub
基本格式:
1 re.sub(pattern, repl, string, count=0, flags=0)
pattern, flags 和 string 解释同match;repl为替换字符串,count替换的最大次数;返回值为替换后的字符串。例:
1 import re 2 match_pattern = re.compile(pattern='www') 3 test_str = 'www.baidu.com.www.baidu' 4 test_str = re.sub(pattern=match_pattern, repl='mmm', string=test_str, count=2) 5 print (test_str) 6 7 # 输出 8 # mmm.baidu.com.mmm.baidu
7. re.split
str.split()可以满足大多数情况下字符串分割任务,但是有时候分隔符并不一定是固定的一个字符串而是具有某种格式,这时候re.split的作用便发挥出来了。
基本格式:
1 re.split(pattern, string, maxsplit=0, flags=0)
pattern, string, flags定义同上,maxsplit为最大分割次数,默认为0表示不限制次数;返回分割后得到的字符串列表。例:
1 import re 2 # '\w\s\w'中'\w'代表任意字母数字及下划线,'\s'代表空白字符 3 split_list = re.split(pattern='\w\s\w', string='www baidu com www baidu') 4 print (split_list) 5 6 # 输出 7 # ['ww', 'aid', 'o', 'w', 'aidu']
8. 正则表达式模式的编写
本文旨在于使得新手可以快速熟悉re各种功能,知道什么场景该用哪些方法,但正则表达式真正的魅力在于匹配模式(也就是re.match里的pattern参数)编写,个人感觉这部分的内容不是随便看看就可以很快掌握的,要在实际工作当中经常练习才可以熟练运用。当然如果仅仅要求能看懂正则表达式的话,并不需要很多学习时间。这部分内容网络上已经有很多了,我这里就不做赘述了,给个链接:http://www.runoob.com/python/python-reg-expressions.html
参考文献:
[1] Python 正则表达式
[2] Python中的惰性计算
[3] Python3正则匹配re.split,re.finditer及re.findall函数用法详解
lkjlkjlkjkjlkj1 re.comp