Python的re模块正则表达式操作


Posted in Python onMay 25, 2016

这个模块提供了与 Perl 相似l的正则表达式匹配操作。Unicode字符串也同样适用。

正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ "。

上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里存在陷阱。raw string就是用'r'作为字符串的前缀,如 r"\n":表示两个字符"\"和"n",而不是换行符了。Python中写正则表达式时推荐使用这种形式。

绝大多数正则表达式操作与 模块级函数或RegexObject方法 一样都能达到同样的目的。而且不需要你一开始就编译正则表达式对象,但是不能使用一些实用的微调参数。

1.正则表达式语法

为了节省篇幅,这里不再叙述了。

2.martch和search的区别

Python提供了两种不同的原始操作:match和search。match是从字符串的起点开始做匹配,而search(perl默认)是从字符串做任意匹配。

注意:当正则表达式是' ^ '开头时,match与search是相同的。match只有当且仅当被匹配的字符串开头就能匹配 或 从pos参数的位置开始就能匹配 时才会成功。如下:

>>> import re
>>> re.match("c", "abcdef")
>>> re.search("c","abcdef")
<_sre.SRE_Match object at 0x00A9A988>
>>> re.match("c", "cabcdef")
<_sre.SRE_Match object at 0x00A9AB80>
>>> re.search("c","cabcdef")
<_sre.SRE_Match object at 0x00AF1720>
>>> patterm = re.compile("c")
>>> patterm.match("abcdef")
>>> patterm.match("abcdef",1)
>>> patterm.match("abcdef",2)
<_sre.SRE_Match object at 0x00A9AB80>

3.模块内容

re.compile(pattern, flags=0)

编译正则表达式,返回RegexObject对象,然后可以通过RegexObject对象调用match()和search()方法。

prog = re.compile(pattern)
result = prog.match(string)


result = re.match(pattern, string)

是等价的。

第一种方式能实现正则表达式的重用。

re.search(pattern, string, flags=0)

在字符串中查找,是否能匹配正则表达式。返回_sre.SRE_Match对象,如果不能匹配返回None。

re.match(pattern, string, flags=0)

字符串的开头是否能匹配正则表达式。返回_sre.SRE_Match对象,如果不能匹配返回None。

re.split(pattern, string, maxsplit=0)

通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)

注意:我使用的Python是2.6,查看源代码发现split()并没有flags的参数,2.7才增加。这种问题我发现不止一次了,官方的文档 跟 源码不一致的现象,如果发现异常,应该去源码中找找原因。

如果在字符串的开始或结尾就匹配,返回的list将会以空串开始或结尾。

>>> re.split('(\W+)', '...words, words...')
['', '...', 'words', ', ', 'words', '...', '']

如果字符串不能匹配,将会返回整个字符串的list。

>>> re.split("a","bbb")
['bbb']

re.findall(pattern, string, flags=0)

找到 RE 匹配的所有子串,并把它们作为一个列表返回。这个匹配是从左到右有序地返回。如果无匹配,返回空列表。

>>> re.findall("a","bcdef")
[]

>>> re.findall(r"\d+","12a32bc43jf3")
['12', '32', '43', '3']

re.finditer(pattern, string, flags=0)

找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。这个匹配是从左到右有序地返回。如果无匹配,返回空列表。

>>> it = re.finditer(r"\d+","12a32bc43jf3")
>>> for match in it:
print match.group()

re.sub(pattern, repl, string, count=0, flags=0)

找到 RE 匹配的所有子串,并将其用一个不同的字符串替换。可选参数 count 是模式匹配後替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。如果无匹配,字符串将会无改变地返回。

re.subn(pattern, repl, string, count=0, flags=0)

与re.sub方法作用一样,但返回的是包含新字符串和替换执行次数的两元组。

re.escape(string)

对字符串中的非字母数字进行转义

re.purge()

清空缓存中的正则表达式

4.正则表达式对象

re.RegexObject

re.compile()返回RegexObject对象

re.MatchObject

group()返回被 RE 匹配的字符串

start()返回匹配开始的位置

end()返回匹配结束的位置

span()返回一个元组包含匹配 (开始,结束) 的位置

5.编译标志

编译标志让你可以修改正则表达式的一些运行方式。在 re 模块中标志可以使用两个名字,一个是全名如 IGNORECASE,一个是缩写,一字母形式如 I。(如果你熟悉 Perl 的模式修改,一字母形式使用同样的字母;例如 re.VERBOSE的缩写形式是 re.X。)多个标志可以通过按位 OR-ing 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

I
IGNORECASE

使匹配对大小写不敏感;字符类和字符串匹配字母时忽略大小写。举个例子,[A-Z]也可以匹配小写字母,Spam 可以匹配 "Spam", "spam", 或 "spAM"。这个小写字母并不考虑当前位置。

L
LOCALE

影响 "w, "W, "b, 和 "B,这取决于当前的本地化设置。

locales 是 C 语言库中的一项功能,是用来为需要考虑不同语言的编程提供帮助的。举个例子,如果你正在处理法文文本,你想用 "w+ 来匹配文字,但 "w 只匹配字符类 [A-Za-z];它并不能匹配 "é" 或 "?"。如果你的系统配置适当且本地化设置为法语,那么内部的 C 函数将告诉程序 "é" 也应该被认为是一个字母。当在编译正则表达式时使用 LOCALE 标志会得到用这些 C 函数来处理 "w 後的编译对象;这会更慢,但也会象你希望的那样可以用 "w+ 来匹配法文文本。

M
MULTILINE

(此时 ^ 和 $ 不会被解释; 它们将在 4.1 节被介绍.)

使用 "^" 只匹配字符串的开始,而 $ 则只匹配字符串的结尾和直接在换行前(如果有的话)的字符串结尾。当本标志指定後, "^" 匹配字符串的开始和字符串中每行的开始。同样的, $ 元字符匹配字符串结尾和字符串中每行的结尾(直接在每个换行之前)。

S
DOTALL

使 "." 特殊字符完全匹配任何字符,包括换行;没有这个标志, "." 匹配除了换行外的任何字符。

X
VERBOSE

该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。当该标志被指定时,在 RE 字符串中的空白符被忽略,除非该空白符在字符类中或在反斜杠之後;这可以让你更清晰地组织和缩进 RE。它也可以允许你将注释写入 RE,这些注释会被引擎忽略;注释用 "#"号 来标识,不过该符号不能在字符串或反斜杠之後。

最后:如果能用字符串的方法,就不要选择正则表达式,因为字符串方法更简单快速。

Python 相关文章推荐
django框架如何集成celery进行开发
May 24 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
python做反被爬保护的方法
Jul 01 Python
python实现简单图书管理系统
Nov 22 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
TensorFlow2.0矩阵与向量的加减乘实例
Feb 07 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
python 爬虫如何实现百度翻译
Nov 16 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
Python基础之元类详解
Apr 29 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
Python的for和break循环结构中使用else语句的技巧
May 24 #Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 #Python
用Python写一个无界面的2048小游戏
May 24 #Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 #Python
Python中set与frozenset方法和区别详解
May 23 #Python
python实现多线程的两种方式
May 22 #Python
python实现简单购物商城
May 21 #Python
You might like
做一个有下拉功能的留言版
2006/10/09 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
采用ThinkPHP中F方法实现快速缓存实例
2014/06/13 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
php中final关键字用法分析
2016/12/07 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
Move.js入门
2017/02/08 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
自己使用总结Python程序代码片段
2015/06/02 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
python如何将两个txt文件内容合并
2019/10/18 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
python else语句在循环中的运用详解
2020/07/06 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
Java程序员面试90题
2013/10/19 面试题
电厂厂长岗位职责
2014/01/02 职场文书
护士求职信
2014/07/05 职场文书
助残日活动总结
2014/08/27 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
户外活动总结
2015/02/04 职场文书
2015个人半年总结范文
2015/03/09 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
感恩老师主题班会
2015/08/12 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL