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





posted @ 2019-01-25 16:15  咕噜咕噜小叔叔  阅读(420)  评论(0编辑  收藏  举报