python万能爬虫,python正则表达式爬虫_Python爬虫之正则表达式一些常用方法

 2023-09-23 阅读 29 评论 0

摘要:正则表达式与Python python万能爬虫。在了解了正则表达式的相关知识之后,开始查看Python当前如何通过使用re模块来支持正则表达式,re模块在很早之前就引入了,用于替换那些已过时的regex模块和regsub模块——这两个模块在Python2.5版中移除,而且此

正则表达式与Python

python万能爬虫。在了解了正则表达式的相关知识之后,开始查看Python当前如何通过使用re模块来支持正则表达式,re模块在很早之前就引入了,用于替换那些已过时的regex模块和regsub模块——这两个模块在Python2.5版中移除,而且此后导入这两个模块中的任意一个都会出发ImportError异常。

re模块支持更强大而且更通用的Perl风格的正则表达式,该模块允许多个线程共享同一个已经编译的正则表达式对象,也支持命名子组。

使用compile( )函数编译正则表达式

后面我们将要介绍的几乎所有的re模块函数都可以作为regex对象的方法。注意,尽管推荐预编译,但这并不是必须的。如果需要编译,就使用编译过的方法:如果不需要编译,就使用函数。幸运的是,不管使用函数还是方法,它们的名字都是相同的。

对于一些特别的正则表达式编译,可选的标记可能以参数的形式给出,这些标记允许不区分大小写的匹配,使用系统的本地化设置来匹配字母数字,等等。

这些标记也可以作为参数适用于大多数re模块函数。如果想要在方法中使用这些标记,它们必须已经集成到已编译的正则表达式对象之中,或者需要使用直接嵌入到正则比啊倒是本身的(?F)标记,其中F是一个或者多个i(用于re.I/IGNORECASE)、m(用于re.M/MULTILINE)、s(用于re.S/DOTALL)等。如果想要使用多个,就把它们放在一起而不是使用按位或操作,例如,(?im)可以用于同时表示re.IGNORECASE和re.MULTILINE。

匹配对象以及group( )和groups( )方法

当处理正则表达式时,除了正则表达式对象之外,还有另一个对象类型:匹配对象。这些是成功调用match( )或者search( )返回的对象。匹配对象有两个主要的方法:group( )和groups( )。

group( )要么返回整个匹配对象,要么根据要求返回特定子组。groups( )则仅返回一个包含唯一或者全部子组的元组。如果没有子组的要求,那么当group( )仍然返回整个匹配时,groups( )返回一个空元组。

使用match( )方法匹配字符串

match( )方法是将要介绍的第一个re模块函数和正则表达式对象方法。match( )函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回None,匹配对象的group( )方法能够用于显示那个成功的匹配。下面是如何运用match( )方法以及group( )方法的一个实例:

4610b912c8fcc3ce14d398965cc8178cd53f2092.png?token=6d962f06b93b08f385ba8734c7294dde&s=6BC213664AE08F7C4E59FD070300E0C1

模式“foo”完全匹配字符串“foo”,我们也能够确认m是交互式解释器中匹配对象的示例。

5366d0160924ab186fe48253e57727c97a890b72.png?token=f7a0fe3bf76c6e9dfbeb5a42df5378b4&s=6BC213661BE09F780E59FD070300E0C1

我们再来看一个失败的匹配示例,它返回None:

c8ea15ce36d3d5399d079aadf40a2854352ab03c.png?token=56655167c2748dec90ab2081bbc0668a&s=6BC213669FE4BD701C518C130300E0C1

因为上面的匹配失败,所以m被赋值为None,而且以此方法构建的if没有指明任何操作。对于剩余的示例,如果可以,为了简单起见,将省去if语句块,但在实际操作中,最好不要省去以避免AttributeError异常(None是返回的错误值,该值并没有group( )属性[方法])。

只要模式从字符串的起始部分开始匹配,即使字符串比模式长,匹配也可以成功。例如,模式"foo"将在字符串"food on the table"中找到一个匹配,因为它是从字符串的起始部分进行匹配的。

38dbb6fd5266d016f8fef62359a6150334fa356c.png?token=24adcb6d936d994201a0866cb9835a10&s=6BC213664EACBF704E7D7C0F0300A0C1

可以看到,尽管字符串比模式要长,但从字符串的起始部分开始匹配依然会正确。子串"foo"是从那个较长的字符串中抽取出来的匹配部分。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/88833.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息