1.正则表达式基础语法
字符匹配:
普通字符:大多数字符(如字母、数字、标点符号)会匹配它们自身。例如,正则表达式abc会匹配字符串中的abc这三个连续的字符。
特殊字符:有些字符在正则表达式中有特殊含义,如^(表示匹配行的开头)、$(表示匹配行的结尾)、.(匹配除换行符外的任意一个字符)、*(匹配前面的字符零次或多次)、+(匹配前面的字符一次或多次)、?(匹配前面的字符零次或一次)。例如,a.*b会匹配以a开头、b结尾的字符串,中间可以有任意多个(包括零个)字符。
字符类:
方括号[]用于定义字符类,匹配其中的任意一个字符。例如,[abc]会匹配a、b或者c中的任意一个。也可以使用范围表示,如[a - z]会匹配任意一个小写字母。
分组:
括号()用于分组。例如,(ab)+会匹配ab这个组合一次或多次出现的情况,如ab、abab等。分组还可以用于在匹配后提取特定的部分,这在提取网页信息时非常有用。
2.在 Python 中使用正则表达式提取网页信息的步骤
导入模块:在 Python 中,需要导入re模块来使用正则表达式。例如,import re。
获取网页内容:首先要有网页的内容,可以通过发送 HTTP 请求(如使用urllib或requests库)来获取网页源代码。假设已经获取到网页内容并存储在变量html_content中。
编写正则表达式模式:根据要提取的特定信息编写正则表达式。例如,如果要提取网页中的所有电子邮件地址,电子邮件地址的一般格式是用户名@域名,可以编写如下正则表达式模式:[a - zA - Z0 - 9_.±]+@[a - zA - Z0 - 9 -]+.[a - zA - Z0 - 9 -]+。
进行匹配和提取:使用re模块中的函数来进行匹配和提取。
re.findall () 函数:用于在字符串中找到所有匹配给定正则表达式的子串,并返回一个列表。例如,email_addresses = re.findall(‘[a - zA - Z0 - 9_.±]+@[a - zA - Z0 - 9 -]+.[a - zA - Z0 - 9 -]+’, html_content),这样就可以得到网页中所有电子邮件地址的列表。
re.search () 函数:在字符串中查找匹配正则表达式的第一个位置,并返回一个匹配对象。如果要提取匹配的内容,可以通过匹配对象的group()方法。例如,match = re.search(‘
3.示例:提取网页中的电话号码
假设网页内容中有电话号码,格式为(xxx) xxx - xxxx。
正则表达式模式可以写为(\d{3}) \d{3}-\d{4}。
代码如下:
import re
html_content = "<p>联系电话:(123) 456 - 7890</p>"
phone_numbers = re.findall('\(\d{3}\)\s*\d{3}\s*-\s*\d{4}', html_content)
print(phone_numbers)
运行结果:[‘(123) 456 - 7890’]
4.注意事项
网页内容的复杂性:网页内容可能很复杂,存在多种格式和编码。例如,HTML 标签可能嵌套,内容可能包含特殊字符。在编写正则表达式时,需要考虑这些因素,可能需要对正则表达式进行调整。
贪婪匹配与非贪婪匹配:在使用*、+等量词时,默认是贪婪匹配,即会尽可能多地匹配字符。如a.b会匹配从第一个a到最后一个b之间的所有字符。如果要实现非贪婪匹配,需要在量词后加上?,如a.?b,这样会匹配最短的符合条件的字符串。
验证正则表达式:可以使用一些在线正则表达式测试工具(如regex101.com)来验证和调试正则表达式,确保其能够正确地匹配和提取想要的信息。