正则表达式re之编译

参考:
http://blog.csdn.net/goodboy5201314/article/details/42642077
http://blog.csdn.net/goodboy5201314/article/details/42642149
一、正则表达式介绍

正则表达式(Regular expressions 也称为 REs,或 regexes 或 regex patterns)
下边是元字符的完整列表():

. ^ $ * + ? { } [ ] \ | ( )

最灵活的应该是元字符 {m, n}(m 和 n 都是十进制整数),上边讲到的几个元字符都可以使用它来表达,它的含义是前一个字符必须匹配 m 次到 n 次之间。例如 a/{1, 3}b 会匹配 a/b,a//b 和 a///b。但不会匹配 ab(没有斜杠);也不会匹配ab(斜杠超过三个)。

你可以省略 m 或者 n,这样的话,引擎会假定一个合理的值代替。省略 m,将被解释为下限 0;省略 n 则会被解释为无穷大(事实上是上边我们提到的 20 亿)。

小甲鱼解释:如果是 {, n} 相当于 {0, n};如果是 {m, } 相当于 {m, +无穷};如果是 {n},则是重复前一个字符 n 次。

其实 、+ 和 ? 都可以使用 {m, n} 来代替。{0,} 跟 是一样的;{1, } 跟 + 是一样的;{0, 1}跟 ? 是一样的。不过还是鼓励大家记住并使用 *、+ 和 ?,因为这些字符更短并且更容易阅读。

下边列举一些反斜杠加字符构成的特殊含义:

特殊字符 含义
\d 匹配任何十进制数字;相当于类 [0-9]
\D 与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9]
\s 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v]
\S 与 \s 相反,匹配任何非空白字符;相当于类 [^ \t\n\r\f\v]
\w 匹配任何字符,见上方解释
\W 于 \w 相反
\b 匹配单词的开始或结束
\B 与 \b 相反

它们可以包含在一个字符类中,并且一样拥有特殊含义。例如 [\s,.] 是一个字符类,它将匹配任何空白字符(/s 的特殊含义),’,’ 或 ‘.’。

最后我们要讲的一个元字符是 .,它匹配除了换行符以外的任何字符。如果设置了 re.DOTALL 标志,. 将匹配包括换行符在内的任何字符。

二、编译

使用 Python 的原始字符串来表示正则表达式(就是在字符串前边加上 r,大家还记得吧…)
当你将正则表达式编译之后,你就得到一个模式对象。那你拿他可以用来做什么呢?模式对象拥有很多方法和属性,我们下边列举最重要的几个来讲:

方法 功能
match() 判断一个正则表达式是否从开始处匹配一个字符串
search() 遍历字符串,找到正则表达式匹配的第一个位置
findall() 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回
finditer() 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回

如果没有找到任何匹配的话,match() 和 search() 会返回 None;如果匹配成功,则会返回一个匹配对象(match object),包含所有匹配的信息:例如从哪儿开始,到哪儿结束,匹配的子字符串等等。

>>> import re
>>> p = re.compile('[a-z]+')
>>> p
re.compile('[a-z]+')
>>> p.match("")
>>> print(p.match(""))
None

接下来让我们来看看匹配对象(即:match对象)里边有哪些信息吧。匹配对象包含了很多方法和属性,以下几个是最重要的:

方法 功能
group() 返回匹配的字符串
start() 返回匹配的开始位置
end() 返回匹配的结束位置
span() 返回一个元组表示匹配位置(开始,结束)

>>> m.group()
'fishc'
>>> m.start()
0
>>> m.end()
5
>>> m.span()
(0, 5)

在实际应用中,最常用的方式是将匹配对象存放在一个局部变量中,并检查其返回值是否为 None。

形式通常如下:

p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')

match()和search()的区别详解:
match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none

例如:

import re 
text = 'pythontab'
m = re.match(r"\w+", text) 
if m:    
    print (m.group(0))
else:   
    print ('not match' )
结果是:pythontab

而:

import re
text = '@pythontab'
m = re.match(r"\w+", text) 
if m:    
    print (m.group(0) )
else:   
    print ('not match' )
结果是:not match

search()会扫描整个字符串并返回第一个成功的匹配

例如:

import re 
text = '@pythontab'
m = re.search(r"\w+", text) 
if m:    
    print (m.group(0) )
else:   
    print ('not match' )
结果是:pythontab

最后最后,有两个方法可以返回所有的匹配结果,一个是 findall(),另一个是 finditer()。
findall() 返回的是一个列表:

>>> p = re.compile(r"\d+")
>>> p.findall("001z123s222s")
['001', '123', '222']

finditer() 则是将匹配对象作为一个迭代器返回:

>>> for match in p.finditer("04kk19oo62ss00"):
    print(match.group(),end = " " )

04 19 62 00 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值