您的位置:首页 > 编程语言 > Python开发

Python - 正则表达式学习笔记

2015-04-27 00:00 579 查看
摘要: 学习Python有段时间了,就想着用Python写一个爬虫程序,其中遇到了正则匹配的问题,发现不能像以前做JAVA那样网上去找正则就搞定,现在需要深入、系统地学习正则表达式。

2015-4-27 11:09:35

目前还在学习正则的基础,今天遇到了贪婪匹配(*)和非贪婪匹配(?)的问题,刚开始真是完全无法理解啊。

在网上去找了资料,有这样一个例子(这个例子经过自己的实践,发现有误):

-------------------》 引文 Begin

源字符串:aa<div>test1</div>bb<div>test2</div>cc

正则表达式一:<div>.*</div>
匹配结果一:<div>test1</div>bb<div>test2</div>

正则表达式二:<div>.*?</div>
匹配结果二:<div>test1</div>(这里指的是一次匹配结果,所以没包括<div>test2</div>)

作者的解释是这样的:

正则表达式一采用的是贪婪模式,在匹配到第一个“</div>”时已经可以使整个表达式匹配成功,但是由于采用的是贪婪模式,所以仍然要向右尝试匹配,查看是否还有更长的可以成功匹配的子串,匹配到第二个“</div>”后,向右再没有可以成功匹配的子串,匹配结束,匹配结果为
“<div>test1</div>bb<div>test2</div>”。当然,实际的匹配过程并不是这样的,后面的匹配原理会详细介绍。
仅从应用角度分析,可以这样认为,贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。
正则表达式二采用的是非贪婪模式,在匹配到第一个“</div>”时使整个表达式匹配成功,由于采用的是非贪婪模式,所以结束匹配,不再向右尝试,匹配结果为“<div>test1</div>”。
仅从应用角度分析,可以这样认为,非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配,也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,至于还有没有没捡的就不管了。

-------------------》 引文 End

以上是原作者的讲解,但是我通过Python实践了下,结果和作者有出入,当然,我不肯定是否和语言有关,对于表达式一,我没有异议,对于表达式二的结果,我试验的代码如下:

import re

data = "aa<div>test1</div>bb<div>test2</div>cc"

zz = re.compile(r'<div>.*?</div>')

matches = zz.findall(data)

print(matches)
运行结果:

['<div>test1</div>', '<div>test2</div>']
就我自己实践的结果来理解,我认为非贪婪模式下,当匹配到第一个</div>的时候,当次匹配结束,但是源字符串还有未读的内容,再从第一个</div>的后一个字符重新开始从<div>开始匹配,知道找到下一个</div>,依次类推,直到读完整个源字符串。

当然,博主作为初学者,还是不太确定是否是这样,也许和findall(..)有关系。

刚才还看到一个描述:边界匹配(不消耗待匹配字符串中的字符)

这个消耗还挺有意思,相信应该很重要。

开始学习 re模块,先来一张图:

Python中正则表达式匹配流程



Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python 正则