python正则表达式

正则表达式为高级的文本模式匹配、提取、与/或文本形式的搜索和替换功能提供了基础。python标准库中的re模块提供了对正则表达式的支持。接下来,主要介绍python正则表达式中最常用的内容。

1、python正则表达式匹配规则

下图列举的是python正则表达式中最常用的特殊符号与字符。

特殊符号与字符

2、re模块

2.1 re模块的函数以及方法

re模块函数/方法功能
complie(pattern, flags=0)根据正则表达式创建匹配对象
match(pattern, string[, flag])在字符串的开始处进行匹配,返回matchObject或者None
search(pattern, string[, flag])在字符串中寻找模式,返回matchObject或者None
findall(pattern, string[, flag])以列表的形式返回匹配的所有子串(非重复)
finditer(pattern, string[,flag])返回一个顺序访问每一个匹配结果(matchObject)的迭代器
split(pattern, string[, maxsplit])根据模式的匹配项来分割字符串
sub(pattern, repl, string[, count])使用repl替换所有正则表达式的模式在字符串中出现的位置,count标识最多替换的次数(默认为全部替换)
subn(pattern, repl, string[, count])功能与sub基本相同,但是此方法会返回替换操作的次数
匹配对象的方法与属性描述
string匹配时使用的字符串
re匹配时使用的pattern对象
pos文本中正则表达式开始搜索的索引
endpos最后一个被捕获的分组在文本中的索引,默认为None
lastgroup最后一个被捕获的分组的别名,默认是None
group([group1, group2, …])获得一个或者多个分组截获的字符串;指定多个参数时,以元组形式返回;group1可以使用编号也可以使用别名,其中编号0表示整个匹配的子串;默认返回None
groups()以元组的形式返回全部分组截获的字符串
groupdict()返回以有别名的组的别名为键、以组截获的字符串为值的字典,不包含没有别名的
start([group])返回指定的组截获的字串在string中的开始索引,group默认为0
end([group])返回指定的组截获的字串在string中的结束索引(最后一个字符索引+1),group默认为0
span([group])返回(start([group]), end([group]))
expand(tmplate)将匹配的分组带入tmplate中返回

2.2 匹配模式/模块属性

re的模块中的compilematch 等函数/方法最后一个参数是flag,是用来标识匹配模式的。常用的匹配模式如下:

模式描述
re.I/re.IGNORECASE忽略大小写
re.L/re.LOCALE根据所使用的本地语言环境通过\w \W \b \B \s \S实现匹配
re.M/re.MULTILINE多行模式,^和$在匹配字符串开始和结尾的同时,也匹配目标字符串中行首和行尾
re.S/re.DOTALL使点号可以匹配全部字符(默认情况是不匹配\n的)
re.X/re.VERBOSE详细模式,正则表达式可以是多行的,忽略空白字符,同时可以添加注释

除了上述通过函数参数的方式设置匹配模式,还可以直接在将匹配模式通过 “?iLmsux” 方式嵌入到正则表达式中。其中?i ==re.I?m ==re.M?s ==re.S 等。同时可以将多个标识放置在一起,比如:?im 可用于同时表示re.Ire.M

2.3 转义字符、贪婪模式

2.3.1 转义字符

当程序中需要匹配re模块中的特殊字符时,比如. * \ +等特殊字符时,需要在这些字符前添加反斜杠 \ 对其进行转义。
需要注意的是:
当使用普通字符串表示正则表达式时,这时需要两个层次的转移:1)python解释器转义;2)re模块转移。这就导致了,当程序需要匹配特殊字符时,需要在这个特殊字符前添加两个反斜杠 \\ 。比如为了匹配 "python.org" 程序中需要使用正则表达式"python\\.org" 来匹配。
为了简化上述问题,python中提供了原始字符串,上述匹配问题可以使用正则表达式 r"python\.org" 来完成匹配,这样做就不需要python解释器这一层次的转移了(只用一个反斜杠就可以实现匹配上述字符串)

2.3.2 贪婪模式

在默认情况,特殊字符: * + ? {} 在匹配词的时候是贪婪的(尽可能多的匹配字符);
有时候,贪婪模式并不是我们想要的结果;
在这些字符后添加 ? 即:*? +? ?? {}? 可以实现其非贪婪模式(尽可能少的匹配字符)
例如:
字符串”abbbc”
贪婪模式: r”ab*” 将匹配”abbb”
非贪婪模式:r”ab*?” 将匹配”a”

2.4 实例

2.4.1 匹配对象的方法和属性测试实例

>>> import re
>>> ptn = re.compile(r"(\w+) (\w+)(?P<sign>.*)")
>>> m = ptn.match("hello world!")
>>> print "m.string:", m.string
m.string: hello world!
>>> print "m.re:", m.re
m.re: <_sre.SRE_Pattern object at 0x7f7b209479c0>
>>> print "m.pos:", m.pos
m.pos: 0
>>> print "m.endpos:", m.endpos
m.endpos: 12
>>> print "m.lastindex:", m.lastindex
m.lastindex: 3
>>> print "m.lastgroup:", m.lastgroup
m.lastgroup: sign
>>> print "m.group():", m.group()
m.group(): hello world!
>>> print "m.group(1,2):", m.group(1, 2)
m.group(1,2): ('hello', 'world')
>>> print "m.groups():", m.groups()
m.groups(): ('hello', 'world', '!')
>>> print "m.groupdict():", m.groupdict()
m.groupdict(): {'sign': '!'}
>>> print "m.start(2):", m.start(2)
m.start(2): 6
>>> print "m.end(2):", m.end(2)
m.end(2): 11
>>> print "m.span(2):", m.span(2)
m.span(2): (6, 11)
>>> print r"m.expand(r'\g \g\g'):", m.expand(r'\2 \1\3')
m.expand(r'\g \g\g'): world hello!

2.4.2 re模块函数与方法实例

>>> ptn = re.compile(r"\d+")
>>> print ptn.split("one1two2three34four4")
['one', 'two', 'three', 'four', '']
>>> print ptn.findall("one1two2three34four4")
['1', '2', '34', '4']
>>> for m in re.finditer(ptn,'one1two2three3four4'):    
...     print m.group()
... 
1
2
3
4
>>> ptn = re.compile(r"(\w+)\s(\w+)")
>>> s = "i say, hello world!"
>>> print ptn.sub(r"\2 \1", s)
say i, world hello!
>>> def func(m):
...     return m.group(1).title()+" "+m.group(2).title()
... 
>>> print re.sub(ptn,func, s)
I Say, Hello World!

特别说明sub方法:
1)当repl是一个字符串时,可以使用\id或者\g引用分组,但不能使用编号0
2)当repl是一个方法时,这个方法只接受一个matchObject对象作为参数,并放回一个字符串用于替换
3)count用于指定最多替换次数,不指定时全部替换

3、正则表达式提取网页数据

以下两个爬虫程序中网页数据的提取,使用就是python的正则表达式。
豆瓣图书爬虫
糗事百科文本段子爬虫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值