Python正则表达式(三):编译正则表达式与执行匹配

来源:互联网 发布:淘宝网金丝绒套装 编辑:程序博客网 时间:2024/06/08 08:12

Python正则表达式(一):元字符

Python正则表达式(二):预设字符

这两篇的学习,是为了能够编写正则表达式。

编写完正则表达式后,我们通过re.compile()进行编译。


>>> ref = re.compile("\d{3}")>>> print ref<_sre.SRE_Pattern object at 0x01A9E8E0>

通过re.compile(),我们将正则表达式编译成SRE_Pattern实例。

SRE_Pattern实例,有几个常用的方法:


match()

从字符串开始位置进行匹配,并返回第一个匹配结果

>>> ref = re.compile("\d{2}")>>> print ref.match("123456").group()12>>> print ref.match("a123456")None


search()

扫描整个字符串,并返回第一个匹配结果

>>> ref = re.compile("\d{2}")>>> print ref.search("a123456").group()12
search()与match()的差别在于:后者必须从字符串的开始位置进行匹配。



findall()

扫描整个字符串,并以列表的形式返回所有匹配结果

>>> ref = re.compile("\d{2}")>>> print ref.findall("a123456")['12', '34', '56']



finditer()

扫描整个字符串,并以迭代器的形式返回所有匹配结果

>>> ref = re.compile("\d{2}")>>> print ref.finditer("a123456")<callable-iterator object at 0x01AC4570>>>> for i in ref.finditer("a123456"):...     print i...<_sre.SRE_Match object at 0x015B7A30><_sre.SRE_Match object at 0x0163DCD0><_sre.SRE_Match object at 0x015B7A30>
迭代器,是Python很重要的语法,有兴趣的,不妨自己去查阅一下。



上面提供的方法,使我们能够“获得”想要的匹配结果,除了“获得”,我们还能对结果进行“分片、替换”等更高级的操作


split(string [, maxsplit = 0])

扫描整个字符串,并在所有匹配的地方分片,最终形成一个列表。

你可以通过设置 maxsplit 值来限制分片数。当 maxsplit 非零时,最多只能有 maxsplit 个分片,字符串的其余部分被做为列表的最后部分返回。

>>> ref = re.compile("\d{2}")>>> print ref.split("a123d454f12a")['a', '3d', '4f', 'a']>>> print ref.split("a123d454f12a",maxsplit=2)['a', '3d', '4f12a']
SRE_Pattern提供的 split() 比 str 提供的split(),功能更强大,能够满足更复杂的需求,但是随之而来的是:效率更低。因此,当我们面对一个已知的、明确的分片任务,不妨先试试str 的 split()。



sub(replacement, string[, count = 0])

扫描整个字符串,并用replacement替换所有满足匹配的地方,最终返回替换后的字符串

可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。

>>> ref = re.compile("\d{2}")>>> print ref.sub("ggg","a123d454f12a")aggg3dggg4fggga>>> print ref.sub("ggg","a123d454f12a",count=2)aggg3dggg4f12a
其中,replacement还可以用函数,如果是函数,则所有满足匹配的地方将会调用函数,并用函数返回值替换匹配对象。

def func(match):return replacementsub(func,string[,count = 0])


subn(replacement, string[, count = 0])
与sub方法作用一样,但返回的是包含新字符串和替换执行次数的两元组。

>>> ref = re.compile("\d{2}")>>> print ref.subn("ggg","a123d454f12a",count=2)('aggg3dggg4f12a', 2)>>> print ref.subn("ggg","a123d454f12a")('aggg3dggg4fggga', 3)



在使用re.compile()编译正则表达式时,我们还可以增加编译标志,以改变正则表达式的一些运行方式,如:


IGNORECASE:使匹配对大小写不敏

ref = e.compile(...,re.I)


M

MULTILINE:多行文本

^将匹配每行行首

$将匹配每行行尾



S

DOTALL

使元字符“.”匹配任何字符。



X

VERBOSE

使字符串的空白符被忽略,这有利于我们写出更易读的正则表达式

例如,我们要对身份证信息进行分解:

ref = re.compile("""(\d{6})#地址码,地址码的编码规则为:第一位表示地区,第一、二两位组合表示省,自治区,直辖市,第3、4为表示地区,第5、6为表示县的名称(\d{8})#出生日期码,表示出生的年、月、日(\d{3})#顺序码,表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性\d#校验码(第十八位数):作为尾号的校验码,分别为罗马数字0、1、2、3、4、5、6、7、8、9、x中的某一位""",re.X)



小结:正则表达式,是把一个具有特殊含义字符串(该字符串由元字符、预设字符和普通字符组成),通过re.compile()编译成SRE_Pattern实例。

该实例具有一些方法:

match()、search()返回SRE_Match对象,SRE_Match对象有一些方法,其中group()分组方法,是比较常用的一种,我们将在后文详细阐述。

findall()、split()返回列表【已经是最终结果,可直接使用】

finditer()返回迭代器【迭代器内,仍由SRE_Match对象组成

sub()返回字符串【已经是最终结果,可直接使用】

subn()返回元组【已经是最终结果,可直接使用】

另外,我们还能通过增加编译标志,来改变正则表达式的运行方式。


有时候,明明觉得自己写的正则表达式没错,但是匹配的结果却不一样,为什么会这样?

正则表达式,到底是什么运转的呢?

请看下集!



与代码无关:
总是利用一点上班时间来阅读文章,通过阅读文章,我们可以学习到:
“原来这个功能,还能这么做!”
“原来这个框架还有这个功能,我怎么不知道?!”
“原来你是这样成为大牛的”
……
阅读文章带来的收益,不仅是技术上的,更多也许是思想上、心态上的提升。
与君共勉。


0 0
原创粉丝点击