Python正则表达式常用函数总结


Posted in Python onJune 24, 2017

本文实例总结了Python正则表达式常用函数。分享给大家供大家参考,具体如下:

re.match()

函数原型:

match(pattern, string, flags=0)
    Try to apply the pattern at the start of the string,
     returning a match object, or None if no match was found.

函数作用:

re.match函数尝试从字符串的开头开始匹配一个模式,如果匹配成功,返回一个匹配成功的对象,否则返回None。

参数说明:

pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。

我们可以使用group()或groups()匹配对象函数来获取匹配后的结果。

group()

group(...)
    group([group1, ...]) -> str or tuple.
    Return subgroup(s) of the match by indices or names.
    For 0 returns the entire match.

获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表匹配的整个子串;默认返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。

groups()

groups(...)
    groups([default=None]) -> tuple.
    Return a tuple containing all the subgroups of the match, from 1.
    The default argument is used for groups
    that did not participate in the match

以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。没有截获字符串的组以默认值None代替。

实例

import re
line = "This is the last one"
res = re.match( r'(.*) is (.*?) .*', line, re.M|re.I)
if res:
 print "res.group() : ", res.group()
 print "res.group(1) : ", res.group(1)
 print "res.group(2) : ", res.group(2)
 print "res.groups() : ", res.groups()
else:
 print "No match!!"

re.M|re.I:这两参数表示多行匹配|不区分大小写,同时生效。

细节实例:

>>> re.match(r'.*','.*g3jl\nok').group()
'.*g3jl'

.(点)表示除换行符以外的任意一个字符,*(星号)表示匹配前面一个字符0次1次或多次,这两联合起来使用表示匹配除换行符意外的任意多个字符,所以出现以上的结果。

1、
re.match(r'.*..', '..').group()
'..'
2、
>>> re.match(r'.*g.','.*g3jlok').group()
'.*g3'
3、
>>> re.match(r'.*...', '..').group()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

上面两例子为什么有结果呢?这是因为第一个例子.*..中的.*匹配了0次,后面的..匹配字符串中..,而第二个例子中的 .* 匹配了一次,匹配字符串中的 .*,g匹配了后面的g字符,最后一个.号匹配了。
为什么第三个例子没有匹配到结果呢?这是因为就算正则表达式中的 .* 匹配0次,后面的三个点也不能完全匹配原字符串中的两个点,所以匹配失败了。
从上面几个例子可以看出,只有当正则表达式中要匹配的字符数小于等于原字符串中的字符数,才能匹配出结果。并且 “.*” 在匹配的过程中会回溯,先匹配0次,如果整个表达式能匹配成功,再匹配一次,如果还是能匹配,那就匹配两次,这样一次下去,直到不能匹配成功时,返回最近一次匹配成功的结果,这就是”.*”的贪婪性。

匹配Python中的标识符:

>>> re.match(r'^[a-zA-Z|_][\w_]*','_1name1').group()
'_1name1'
>>> re.match(r'^[a-zA-Z|_][\w_]*','_name1').group()
'_name1'
>>> re.match(r'^[a-zA-Z|_][\w_]*','num').group()
'num'
>>> re.match(r'^[a-zA-Z|_][\w_]*','1num').group()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

re.search()

函数原型:

search(pattern, string, flags=0)
    Scan through string looking for a match to the pattern,
    returning a match object, or None if no match was found.

函数作用:

扫描整个字符串并返回第一次成功的匹配对象,如果匹配失败,则返回None。

参数说明:

pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。

跟re.match函数一样,使用group()和groups()方法来获取匹配后的结果。

>>> re.search(r'[abc]\*\d{2}','12a*23Gb*12ad').group()
'a*23'

从匹配结果看出,re.search返回了第一次匹配成功的结果'a*23',如果尽可能多的匹配的话,还可以匹配后面的'b*12'。

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配,否则也返回None。

>>> re.match(r'(.*)(are)',"Cats are smarter than dogs").group(2)
'are'
>>> re.search(r'(are)+',"Cats are smarter than dogs").group()
'are'

上面两个例子是等价的。

re.sub()

Python的re模块中提供了re.sub()函数用于替换字符串中的匹配项,如果没有匹配的项则字符串将没有匹配的返回。

函数原型:

sub(pattern, repl, string, count=0, flags=0)
    Return the string obtained by replacing the leftmost
    non-overlapping occurrences of the pattern in string by the
    replacement repl.  repl can be either a string or a callable;
    if a string, backslash escapes in it are processed.  If it is
    a callable, it's passed the match object and must return
    a replacement string to be used.

参数说明:

pattern:匹配的正则表达式
repl:用于替换的字符串
string:要被替换的字符串
count:替换的次数,如果为0表示替换所有匹配到的字串,如果是1表示替换1次等,该参数必须是非负整数,默认为0。
flags:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。

实例

将手机号的后4位替换成0

>>> re.sub('\d{4}$','0000','13549876489')
'13549870000'

将代码后面的注释信息去掉

>>> re.sub('#.*$','', 'num = 0 #a number')
'num = 0 '

re.split()

函数原型:

split(pattern, string, maxsplit=0, flags=0)
    Split the source string by the occurrences of the pattern,
    returning a list containing the resulting substrings.

函数作用:

分割字符串,将字符串用给定的正则表达式匹配的字符串进行分割,分割后返回结果list。

参数说明:

pattern:匹配的正则表达式
string:被分割的字符串
maxsplit:最大的分割次数
flags:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。

re.findall()

函数原型:

findall(pattern, string, flags=0)
    Return a list of all non-overlapping matches in the string.
    If one or more groups are present in the pattern, return a
    list of groups; this will be a list of tuples if the pattern
    has more than one group.
    Empty matches are included in the result.

函数的作用:

获取字符串中所有匹配的字符串,并以列表的形式返回。列表中的元素有如下几种情况:

当正则表达式中含有多个圆括号()时,列表的元素为多个字符串组成的元组,而且元组中字符串个数与括号对数相同,并且字符串排放顺序跟括号出现的顺序一致(一般看左括号'(‘就行),字符串内容与每个括号内的正则表达式想对应。
当正则表达式中只带有一个圆括号时,列表中的元素为字符串,并且该字符串的内容与括号中的正则表达式相对应。(注意:列表中的字符串只是圆括号中的内容,不是整个正则表达式所匹配的内容。)
当正则表达式中没有圆括号时,列表中的字符串表示整个正则表达式匹配的内容。

参数说明:

pattern:匹配的正则表达式
string:被分割的字符串
flags:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。

实例:

1、匹配字符串中所有含有'oo'字符的单词

#正则表达式中没有括号
>>> re.findall(r'\w*oo\w*', 'woo this foo is too')
['woo', 'foo', 'too']

从结果可以看出,当正则表达式中没有圆括号时,列表中的字符串表示整个正则表达式匹配的内容

2、获取字符串中所有的数字字符串

#正则表达式中只有1个括号
>>> re.findall(r'.*?(\d+).*?','adsd12343.jl34d5645fd789')
['12343', '34', '5645', '789']

从上面结果可以看出,当正则表达式中只带有一个圆括号时,列表中的元素为字符串,并且该字符串的内容与括号中的正则表达式相对应。

3、提取字符串中所有的有效的域名地址

#正则表达式中有多个括号时
>>> add = 'https://www.net.com.edu//action=?asdfsd and other https://www.baidu.com//a=b'
>>> re.findall(r'((w{3}\.)(\w+\.)+(com|edu|cn|net))',add)
[('www.net.com.edu', 'www.', 'com.', 'edu'), ('www.baidu.com', 'www.', 'baidu.','com')]

从执行结果可以看出,正则表达式中有多个圆括号时,返回匹配成功的列表中的每一个元素都是由一次匹配成功后,正则表达式中所有括号中匹配的内容组成的元组。

re.finditer()

函数原型:

finditer(pattern, string, flags=0)
    Return an iterator over all non-overlapping matches in the string.  For each match, the iterator
returns a match object.
    Empty matches are included in the result.

函数作用:

跟re.findall()函数一样,匹配字符串中所有满足的字串,只是返回的是一个迭代器,而不是一个像findall函数那样存有所有结果的list,这个迭代器里面存的是每一个结果的一个匹配对象,这样可以节省空间,一般用在需要匹配大量的结果时,类似于range和xrange的区别。

参数说明:

pattern:匹配的正则表达式
string:被分割的字符串
flags:标志位,用于控制正则表达式的匹配方式。如是否区分大小写、是否多行匹配等。

如:匹配字符串中所有的数字字串

>>> for i in re.finditer(r'\d+','one12two34three56four') :
...  print i.group(),
...
12 34 56

start()

返回匹配的起始位置。如:

>>> re.search(r'\d+', 'asdf13df234').start()

注意,索引位置是从0开始计数的。

end()

返回匹配结束的下一个位置。如:

>>> re.search(r'\d+', 'asdf13df234').end()

span()

返回匹配的区间,左闭右开。如:

>>> re.search(r'\d+', 'asdf13df234').span()
(4, 6)

re.compile()

函数原型:

compile(pattern, flags=0)
    Compile a regular expression pattern, returning a pattern object.

函数作用:

编译一个正则表达式语句,并返回编译后的正则表达式对象。
这样我们就可以将那些经常使用的正则表达式编译成正则表达式对象,可以提高一定的效率。如:
一句话包含五个英文单词,长度不一定,用空格分割,请把五个单词匹配出来

>>> s = "this is  a python test"
>>> p = re.compile('\w+') #编译正则表达式,获得其对象
>>> res = p.findall(s)#用正则表达式对象去匹配内容
>>> print res
['this', 'is', 'a', 'python', 'test']
Python 相关文章推荐
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
python实现给数组按片赋值的方法
Jul 28 Python
python对象及面向对象技术详解
Jul 19 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
python3中str(字符串)的使用教程
Mar 23 Python
python列表每个元素同增同减和列表元素去空格的实例
Jul 20 Python
Django 查询数据库并返回页面的例子
Aug 12 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
Mar 06 Python
vue常用指令代码实例总结
Mar 16 Python
Django中的AutoField字段使用
May 18 Python
Python如何把不同类型数据的json序列化
Apr 30 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 #Python
Python实现的爬虫功能代码
Jun 24 #Python
python3操作mysql数据库的方法
Jun 23 #Python
Python 中pandas.read_excel详细介绍
Jun 23 #Python
python3.4用函数操作mysql5.7数据库
Jun 23 #Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 #Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
Jun 23 #Python
You might like
php生成图形验证码几种方法小结
2013/08/15 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
详解vue-cli3使用
2018/08/14 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Python如何读写二进制数组数据
2020/08/01 Python
零基础学python应该从哪里入手
2020/08/11 Python
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
我的中国梦口号
2014/06/16 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书