错过了秋招学习春招感觉是满满的绝望啊。希望大家抓紧时间,努力学习。

正则表达式是处理字符串的强大工具,也是从HTML网页源代码中提取信息的常用方法之一,用于实现字符串的检索、替换、匹配验证等功能。下表列出了常用的匹配规则。

图片说明

调用程序包re的函数search()匹配满足正则表达式的第一条结果,其中

第1个参数pattern表示正则表达式对象或字符串;
第2个参数string表示待匹配的字符串;
第3个参数flag表示修饰符,'re.S'表示通配符.可以匹配包括换行符在内的所有字符,如果不设置则通配符.不能匹配换行符。
该网页的标题是在标签之间,使用正则表达式匹配,其中

\S匹配非空字符;

  • 匹配0个或多个表达式。
    如果没有匹配到任何结果,则返回None,否则返回一个Match对象。

调用该对象的函数group()返回匹配结果。

1. 使用括号()匹配目标

如果只想匹配标题而不想包含标签,则只需要在感兴趣的内容两边加上括号()。此时调用返回的Match对象的函数group(),不传入任何参数,则仍然会返回完整匹配结果。 而只需要在该函数中传入一个序号就可以返回感兴趣的内容。由于这里的正则表达式只包含了一组括号(),因此仅仅传入序号1有效。

该网页的标题为“百度新闻搜索_人工智能”,如果想分别匹配下划线_前后的两个部分,可以分别使用两对括号()。此时调用返回的Match对象的函数group(),传入序号1返回第1个括号对应的内容,传入序号2返回第2个括号对应的内容。

2. 使用星号*做通用匹配

之前的例子中正则表达式包含了完整的标签,也可以使用星号做通用匹配,如以<ti.>和</ti.>取代,其中.匹配了tle。

该网页找到的相关新闻篇数在标签之间,使用正则表达式nums.*约([\d,]+)匹配,其中

*匹配">找到相关新闻;
\d匹配数字;
[\d,]匹配数字或逗号,;
+匹配1个或多个表达式。

3. 贪婪与非贪婪

正则表达式匹配时,匹配数量可多可少,如上一个例子中([\d,]+)最少匹配1,最多匹配187,000。

最少匹配也称为非贪婪匹配,在+后面加上?表示非贪婪匹配;
最多匹配也称为贪婪匹配,不加上?则默认表示贪婪匹配。
以下例子为非贪婪匹配,可以看出仅匹配了第一个数字。

4. 修饰符re.S

在网页源代码中找到相关新闻约187,000篇的上一行为

,然而并不能匹配。
原因在于.在默认情况下不能匹配换行符。调用程序包re的函数search()时,指定第3个参数flag修饰符为re.S则可以让.匹配换行符。
同样的,在匹配搜索结果的标题时,我们发现标题是单独的一行,且位于标签<h3 class="c-title">中。使用正则表达式c-title">.?>\n(.?)匹配,并指定修饰符为re.S。

5. 匹配多个结果

从上一小节的例子可以看出,虽然该网页包含10条新闻搜索结果,但程序包re中的函数search()仅返回了第一条匹配结果,而另一个函数findall()则可以返回所有匹配结果,参数列表与函数search()完全相同。 不同的是,返回结果是匹配目标的列表。