Python标准库 re
正则表达式 regular expression 用来匹配一系列符合句法规则的字符串,是一门独立的小型的语言,如果你了解类Unix系统,那么你对正则表达式就一定不陌生。正则表达式的概念最初是由Unix中的工具普及开的(如: sed grep)。Python中也内嵌了正则表达式,通过re模块实现。正则表达式有什么用?例如你需要从一大段Html代码中把Email地址或图片链接等过滤出来,那么正则表达式就很有用。
主内容: Python标准库01 正则表达式re包
出处: Vamei 博客 http://www.cnblogs.com/vamei
因为归纳的比较直观,不需要再重写一篇。
补充
正则表达式中,group() 用来提出分组截获的字符串,( )包围了一个小的正则表达式。
>>> a = '123abc456'
>>> re.search("(\d{3})([a-z]{3})(\d{3})",a).group(0)
'123abc456'
>>> re.search("(\d{3})([a-z]{3})(\d{3})",a).group(1)
''
>>> re.search("(\d{3})([a-z]{3})(\d{3})",a).group(2)
'abc'
>>> re.search("(\d{3})([a-z]{3})(\d{3})",a).group(3)
''
一些正则用法:
>>> s= r'abc' #定义一个规则
>>> re.findall(s,'ababc123abc') #字符串中满足规则便会返回结果,如果不符合,返回一个空列表
['abc','abc']
>>> re.findall(s,'abaaaaaaaa')
[]
转义 (如果需要匹配的字符串之中包含元字符怎么办?)
>>> r = r"\^\$abc" # \^ \$ 把^和$的特殊含义转义掉了
>>> str = "^$abc abc ^abc $abc"
>>> re.findall(r,str)
['^$abc']
元字符
[ ]
>>> str = "top tip tap ttp tep"
>>> r1 = r"t[io]p" # t和p之间要么有i 要么有o
>>> re.findall(r1,str)
['top', 'tip']
>>> r1 = r"t[^io]p" #在[]中字母前加 ^ 便表示取反
>>> re.findall(r1,str)
['tap', 'ttp', 'tep']
^ 和 $
>>> str = "name is , abcss"
>>> r = r"^na"
>>> re.findall(r,str)
['na']
>>>
>>> str = "name is , bob"
>>> r = r"bob$"
>>> re.findall(r,str)
['bob']
* 前一个字符重复0次或多次
>>> r =r"aa*"
>>> re.findall(r,'ab')
['a']
>>> re.findall(r,'aaaaaa')
['aaaaaa']
>>> re.findall(r,'aa')
['aa']
>>> re.findall(r,'a')
['a']
+ 匹配一次或多次,至少一次
>>> r =r"aa+"
>>> re.findall(r,'aa')
['aa']
>>> re.findall(r,'ab')
[]
>>> re.findall(r,'aaaaa')
['aaaaa']
>>> re.findall(r,'a')
[]
? 匹配一次或0次,常表示可有可无
>>> r = r"^010-*\d{8}$"
>>> re.findall(r,'010-12345678')
['010-12345678']
>>> re.findall(r,'')
['']
>>> re.findall(r,'010-----12345678') #这样无限输入也可以,不是我们需求的
['010-----12345678']
>>> r = r"^010-?\d{8}$"
>>> re.findall(r,'')
['']
>>> re.findall(r,'010-12345678')
['010-12345678']
>>> re.findall(r,'010---12345678')
[]
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配
贪婪模式
>>> r = r'what+'
>>> re.findall(r,'whatttttttttttt')
['whatttttttttttt']
非贪婪模式 ? 加在重复的后面可以做最小匹配
>>> r = r'what+?'
>>> re.findall(r,'whatttttttttttt')
['what']
re 常用函数
findall() 找到匹配的所有字符串,并把它们作为一个列表返回
search() 扫描字符串,找到匹配的位置
match() 扫描字符串,匹配开头
>>> reg = re.compile(r'what')
>>> reg.findall('abcwhat')
['what']
>>> reg.match('abcwhat') # 没有匹配的内容则返回空
>>> reg.match('whatabc')
<_sre.SRE_Match object at 0x7f7d63e8c3d8>
>>> reg.search('abcwhat') # match和search的区别是match只匹配开头
<_sre.SRE_Match object at 0x7f7d63e8c440>
>>> reg.search('abcwh')
finditer() 找到匹配的所有字符串,并把它们作为一个迭代器返回
>>> s = reg.finditer('abcwhat what vvvwhat')
>>> s.next() # 返回的居然是match对象
<_sre.SRE_Match object at 0x7f7d63e8c440>
>>> s.next()
<_sre.SRE_Match object at 0x7f7d63e8c3d8>
>>> s.next()
<_sre.SRE_Match object at 0x7f7d63e8c440>
>>> s.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
re.sub() 字符串的replace()方法并不支持正则,我们需要用re.sub()来做替换
>>> s = "hello what"
>>> s.replace('w..t','world')
'hello what'
>>>
>>> r = r'w..t'
>>> re.sub(r,'world',s)
'hello world'
re.split()
>>> s = "123-456=789+000*111"
>>> re.split(r'[\+\-\=\*]',s) #有些符号有特殊含义,需要转义一下
['', '', '', '', '']
编译标志 flags
DOTALL,S 使.匹配包括换行在内的所有字符
IGNORCASE,I 使匹配对大小写不敏感
LOCALE,L 做本地化识别 ,支持英文字母外其他语言的字母
MULTILINE,M 多行匹配,影响 ^和$
VERBOSE,X 能够使用REs的verbose状态,使之被组织的更清晰易懂
re.S
>>> r = r'google.com'
>>> re.findall(r,'google.com')
['google.com']
>>> re.findall(r,'googledcom')
['googledcom']
>>> re.findall(r,'googlexcom')
['googlexcom']
>>>
>>> re.findall(r,'google\ncom')
[]
>>> re.findall(r,'google\ncom',re.S)
['google\ncom']
>>> re.findall(r,'google\tcom',re.S)
['google\tcom']
>>>
re.I
reg = re.compile(r'what') #如果我们要让what不区分大小写,怎么办? [Ww[Hh][Aa][Tt] 显然很麻烦,利用re包中的一个属性 re.I 可以不区分大小写.
reg = re.compile(r'what',re.I)
re.M
>>> s = """
... what abc
... abcwhat
... defwhat
... whatnnn
... """
>>> r = r"^what"
>>> re.findall(r,s) #发现什么都没有,因为字符串是以换行符储存的
[]
>>> s
'\nwhat abc\nabcwhat\ndefwhat\nwhatnnn\n\n'
>>> re.findall(r,s,re.M)
['what', 'what']
re.X
>>> tel = r""" #这样定义会很直观
... \d{3,4}
... -?
... \d{8}
... """
>>> re.findall(tel,'010-87654321')
[]
>>> re.findall(tek,'010-87654321',re.X)
['010-87654321']
分组 ( .... )
>>> email = r"\w{3}@\w+(\.com|\.cn)" # \w+表示一个字母以上 |表示或,但是还需要加分组(),分组表示里面包含一个小正则
>>> re.match(email,'abc@google.com')
<_sre.SRE_Match object at 0x7f7d63e995d0>
>>> re.match(email,'abc@google.cn')
<_sre.SRE_Match object at 0x7f7d63e99648>
>>> re.match(email,'abc@google.org')
>>> re.findall(email,'abc@google.com') # 有分组 findall会先返回分组的
['.com']
>>> print s
asasrc=name com sakdak
sad
src=what com adad
addq
>>>
>>> r = r'src=.+ com'
>>> re.findall(r,s)
['src=name com', 'src=what com'] # 如果我只想返回src= 后面的字符串呢?
>>> r = r'src=(.+) com'
>>> re.findall(r,s)
['name', 'what']
图片来自 http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

Python标准库 re的更多相关文章
- Python标准库14 数据库 (sqlite3)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.S ...
- python标准库00 学习准备
Python标准库----走马观花 python有一套很有用的标准库.标准库会随着python解释器一起安装在你的电脑上的.它是python的一个组成部分.这些标准库是python为你准备的利器,可以 ...
- Python标准库:内置函数hasattr(object, name)
Python标准库:内置函数hasattr(object, name) 本函数是用来判断对象object的属性(name表示)是否存在.如果属性(name表示)存在,则返回True,否则返回False ...
- python标准库xml.etree.ElementTree的bug
使用python生成或者解析xml的方法用的最多的可能就数python标准库xml.etree.ElementTree和lxml了,在某些环境下使用xml.etree.ElementTree更方便一些 ...
- 【python】Python标准库defaultdict模块
来源:http://www.ynpxrz.com/n1031711c2023.aspx Python标准库中collections对集合类型的数据结构进行了很多拓展操作,这些操作在我们使用集合的时候会 ...
- Python标准库
Python标准库是随Python附带安装的,它包含大量极其有用的模块.熟悉Python标准库是十分重要的,因为如果你熟悉这些库中的模块,那么你的大多数问题都可以简单快捷地使用它们来解决. sys模块 ...
- Python标准库07 信号 (signal包,部分os包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习 ...
- Python标准库04 文件管理 (部分os包,shutil包)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在操作系统下,用户可以通过操作系统的命令来管理文件,参考linux文件管理相关命令 ...
- Python标准库的学习准备
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准 ...
- Python标准库——走马观花
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python有一套很有用的标准库(standard library).标准库会随着 ...
随机推荐
- 【读后感】Netty 系列之 Netty 高性能之道 - 相比 Mina 怎样 ?
[读后感]Netty 系列之 Netty 高性能之道 - 相比 Mina 怎样 ? 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...
- JAVA学习之 Model2中的Servlet与.NET一般处理程序傻傻分不清楚
时隔多日,多日合适吗,应该是时隔多月.我又想起了一般处理程序.这都是由于近期在实现的DRP系统中经经常使用到jsp+servlet达到界面与逻辑的分离.servlet负责处理从jsp传回的信息:每当这 ...
- Mahout 0.5部署
Mahout下载与安装 1.下载Mahout.到地址[1]可以找到镜像地址.我们下载Mahout 0.5.请将mahout-distribution-0.5.tar.gz和mahout-distrib ...
- 使用std::mutex取代QMutex
为了保证对某个资源的操作是原子性的(对资源读写时,只有当前的操作结束,才允许另外线程对其操作,这里有个理解误区,资源操作原子性不是说,当前某个线程获得了某个资源使用权,然后线程执行时间完毕,要切换线程 ...
- javascript event事件兼容性处理
ie 6-8支持event事件,ff浏览器不支持 获取鼠标点击位置的坐标 document.onclick = function(){ alert(event.clientX +"-&quo ...
- vue中导出Excel表格
项目中我们可能会碰到导出Excel文件的需求,一般后台管理系统中居多,将table中展示的数据导出保存到本地.当然我们也可以通过一些处理来修改要导出的数据格式,具体需求具体对待. 1.首先我们需要安装 ...
- html的书写规范,有哪些注意点
1.最开始的声明格式与编码格式,注意html5与和html4.0的区别,注意对不同浏览器的渲染作用: 2.<head></head>标签中的相关内容的编写: 3.确保引入的jq ...
- POJ2195 Going Home —— 最大权匹配 or 最小费用最大流
题目链接:https://vjudge.net/problem/POJ-2195 Going Home Time Limit: 1000MS Memory Limit: 65536K Total ...
- hdu 1400 Mondriaan's Dream 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1400 题目意思:给出一个h * w的 大 矩形,需要用 1 * 2 的砖块去填充这个大矩形,问填充的方 ...
- hdu acm 1114 Piggy-Bank 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题目意思:给出一个空的猪仔钱ang 的重量E,和一个装满钱的猪仔钱ang 的重量F你,实质上能装 ...