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实践了下,结果和作者有出入,当然,我不肯定是否和语言有关,对于表达式一,我没有异议,对于表达式二的结果,我试验的代码如下:
当然,博主作为初学者,还是不太确定是否是这样,也许和findall(..)有关系。
刚才还看到一个描述:边界匹配(不消耗待匹配字符串中的字符)
这个消耗还挺有意思,相信应该很重要。
开始学习 re模块,先来一张图:
Python中正则表达式匹配流程
Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
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学习笔记21(正则表达式)
- python爬虫之正则表达式学习笔记一
- python学习笔记正则表达式re模块
- (转)Python爬虫学习笔记(2):Python正则表达式指南
- Python学习笔记<正则表达式与python>
- python学习笔记之正则表达式1
- Python学习笔记 第二部分 - 正则表达式 与 爬虫小实例(抓取豆瓣电影中评分大于等于8分的影片)
- Python 正则表达式之 补充学习笔记
- python 学习笔记(5)用户自定义类正则表达式
- Python学习笔记--正则表达式,re模块
- python学习之正则表达式笔记
- 【学习笔记】Python中的正则表达式re
- Python的re(正则表达式)模块学习笔记
- python的正则表达式学习笔记
- python基础学习笔记05-正则表达式与json
- python 正则表达式 学习笔记(不断补充ing)
- 【python学习笔记】用正则表达式从含中文的网页中提取数据(含编码转换)
- Python学习笔记(五)正则表达式
- 【学习笔记】Python正则表达式
- 基于python的正则表达式学习笔记