|
Python爬虫入门(十二):正则表达式前言一、正则表达式的用途二、正则表达式的基本组成元素2.1特殊字符2.2量词2.3位置锚点2.4断言2.5字符集2.6字符类2.6.1基本字符类2.6.2常见字符类简写2.6.3POSIX字符类2.6.4组合使用三、正则表达式语法规则四、高级特性4.1回溯引用(捕获组)示例:匹配重复的单词4.2非捕获组示例:非捕获组的使用4.3贪婪与非贪婪匹配示例:贪婪与非贪婪的区别4.4零宽断言示例:使用零宽断言匹配特定模式五、实战案例5.1网页数据抓取代码示例:提取图片地址5.2数据清洗代码示例:清理电话号码中的特殊字符5.3提取超链接代码示例:提取所有的URL5.4提取网页中的文本内容代码示例:提取段落文本5.5从JSON数据中提取特定键值对代码示例:提取JSON中的特定值5.6清理HTML标签代码示例:去除HTML标签六、总结前言正则表达式(RegularExpression),在编程语言中通常缩写为regex或regexp,是一种用于字符串搜索和操作的模式描述方法。它通过定义一系列的规则来匹配、查找和管理文本数据。正则表达式在线校验:https://tool.oschina.net/regex/一、正则表达式的用途正则表达式在各种编程任务中都有广泛的应用。以下是一些常见的用途:网页数据抓取:通过解析HTML、JSON等格式化数据,爬虫可以精确定位并提取目标数据,例如从网页中提取、链接、图片地址等;数据验证:用于验证用户输入是否符合特定格式,如邮箱地址、电话号码、邮政编码等;文本搜索和替换:能够高效地在文本中查找和替换特定的字符串或模式;字符串操作:用于复杂的字符串操作,如拆分、拼接、重构字符串等。二、正则表达式的基本组成元素在介绍正则表达式之前,我们需要了解一些基本的组成元素:2.1特殊字符任意字符:.匹配除换行符之外的任意单个字符。任意数字:\d等同于[0-9],匹配任意一个数字字符。任意非数字:\D等同于[^0-9],匹配任意一个非数字字符。任意字母:[a-z]匹配任意一个英文小写字母。任意非字母:[^a-z]匹配任意一个非英文小写字母的字符。2.2量词*:出现0次或多次。+:出现1次或多次。?:出现0次或1次。{n}:确定出现n次。{n,}:至少出现n次。{n,m}:出现n到m次。2.3位置锚点^:行的开头。$:行的结尾。2.4断言\b:单词边界。\B:非单词边界。2.5字符集[]:定义一个字符集,匹配其中的任意单个字符。[^]:取反,匹配不在字符集中的任意单个字符。2.6字符类字符类用于定义一组可以匹配的字符。它们通过方括号[]来表示,在匹配过程中,只要目标字符属于字符类中定义的范围,就会成功匹配。2.6.1基本字符类[abc]:匹配a、b或c中的任意一个字符。例如,正则表达式[abc]可以匹配字符串cat中的c。[^abc]:匹配除a、b或c之外的任意字符。例如,正则表达式[^abc]可以匹配字符串dog中的d。[a-z]:匹配所有小写字母(从a到z)。例如,正则表达式[a-z]可以匹配字符串hello中的h。[A-Z]:匹配所有大写字母(从A到Z)。例如,正则表达式[A-Z]可以匹配字符串Hello中的H。[0-9]:匹配所有数字字符(从0到9)。例如,正则表达式[0-9]可以匹配字符串year2024中的2。[a-zA-Z0-9]:匹配所有字母和数字,即大小写字母和数字组合。例如,正则表达式[a-zA-Z0-9]可以匹配字符串Pass123中的P、a、s等字符。2.6.2常见字符类简写在正则表达式中,为了方便书写和理解,常用字符类通常会有一些简写形式:\d:匹配任意一个数字字符,等同于[0-9]。\D:匹配任意一个非数字字符,等同于[^0-9]。\w:匹配任意一个字母、数字或下划线字符,等同于[a-zA-Z0-9_]。\W:匹配任意一个非字母、非数字和非下划线字符,等同于[^a-zA-Z0-9_]。\s:匹配任意一个空白字符,包括空格、制表符、换行符等,等同于[\t\n\r\f\v]。\S:匹配任意一个非空白字符,等同于[^\t\n\r\f\v]。2.6.3POSIX字符类在一些编程语言和工具中,还支持POSIX字符类,它们是预定义的一些字符类,用于匹配特定类型的字符。[:alnum:]:匹配所有字母和数字字符,等同于[a-zA-Z0-9]。[:alpha:]:匹配所有字母字符,等同于[a-zA-Z]。[:digit:]:匹配所有数字字符,等同于[0-9]。[:lower:]:匹配所有小写字母字符,等同于[a-z]。[:upper:]:匹配所有大写字母字符,等同于[A-Z]。[:punct:]:匹配所有标点符号字符。[:space:]:匹配所有空白字符,等同于\s。示例:字符类的使用importre#匹配所有小写字母pattern=r'[a-z]'text="HelloWorld!"matches=re.findall(pattern,text)print(matches)#输出:['e','l','l','o','o','r','l','d']#匹配所有数字字符pattern=r'\d'text="Contact:123-456-7890"matches=re.findall(pattern,text)print(matches)#输出:['1','2','3','4','5','6','7','8','9','0']#使用POSIX字符类匹配所有字母字符pattern=r'[[:alpha:]]'text="Regex101!"matches=re.findall(pattern,text)print(matches)#输出:['R','e','g','e','x']123456789101112131415161718192.6.4组合使用字符类可以与其他正则表达式元素结合使用,形成更加复杂的匹配模式。#匹配由字母和数字组成的字符串pattern=r'\w+'text="User123loggedin."matches=re.findall(pattern,text)print(matches)#输出:['User123','logged','in']#匹配以小写字母开头且后面跟着数字的字符串pattern=r'[a-z]\d+'text="a123B456c789"matches=re.findall(pattern,text)print(matches)#输出:['a123','c789']1234567891011三、正则表达式语法规则正则表达式的语法规则是构建有效正则表达式的基础。以下是一些常见的语法规则:组合:使用|来表示“或”,例如ab|cd可以匹配“ab”或“cd”。分组:使用圆括号()来创建子表达式,允许对正则表达式的部分进行分组。量词:使用量词来指定模式出现的次数。转义特殊字符:使用反斜线\来转义特殊字符,使其作为普通字符匹配。四、高级特性正则表达式除了基本的字符匹配和量词之外,还包含一些高级特性,用于构建更为复杂的匹配模式。4.1回溯引用(捕获组)捕获组不仅可以用于分组,还可以在正则表达式的其他部分进行引用。引用捕获组可以通过反斜线加上捕获组的编号来实现。():用来定义捕获组。\1:表示对第一个捕获组的引用。示例:匹配重复的单词importrepattern=r'\b(\w+)\s+\1\b'text="Thisisatestteststring"match=re.search(pattern,text)ifmatch:print(f"Matched:{match.group(0)}")#输出:'testtest'1234564.2非捕获组有时我们需要分组但不希望它被捕获用于后续引用,可以使用非捕获组(?:...)。示例:非捕获组的使用pattern=r'(?:ab|cd)+'text="ababcdbcd"matches=re.findall(pattern,text)print(matches)#输出:['ababcd','bcd']12344.3贪婪与非贪婪匹配正则表达式的匹配模式默认是贪婪的,即它会尽可能多地匹配字符。可以通过在量词后加上?来使匹配变为非贪婪的,匹配尽可能少的字符。示例:贪婪与非贪婪的区别importretext="helloworld"#贪婪匹配greedy_pattern=r''greedy_match=re.findall(greedy_pattern,text)print(greedy_match)#输出:['helloworld']#非贪婪匹配non_greedy_pattern=r''non_greedy_match=re.findall(non_greedy_pattern,text)print(non_greedy_match)#输出:['','','','']123456789101112134.4零宽断言零宽断言用于在不消费字符的情况下进行匹配。它分为正向零宽断言(Lookahead)和反向零宽断言(Lookbehind)。(?=...):正向零宽断言,表示某位置后必须匹配某模式。(?'''pattern=r'Page1'''pattern=r'
.
Andthethirdparagraph.'''pattern=r'
(.*?)'paragraphs=re.findall(pattern,html_content,re.DOTALL)print(paragraphs)#输出:['Thisisthefirstparagraph.','Hereisthesecondparagraphwith.','Andthethirdparagraph.']12345678910115.5从JSON数据中提取特定键值对在处理API返回的JSON数据时,可以使用正则表达式快速提取特定的键值对。代码示例:提取JSON中的特定值importrejson_data='''{"name":"JohnDoe","email":"john.doe@example.com","phone":"+123-456-7890","address":"123MainSt,Anytown,USA"}'''pattern=r'"phone":\s*"(.*?)"'phone_number=re.search(pattern,json_data).group(1)print(phone_number)#输出:'+123-456-7890'12345678910111213145.6清理HTML标签清理文本中的HTML标签,提取纯文本内容。代码示例:去除HTML标签importrehtml_content='''
Title
Thisisaboldstatement.
Hereisaandsomeitalictext.'''clean_text=re.sub(r'','',html_content)print(clean_text)#输出:'Title\nThisisaboldstatement.\nHereisalinkandsomeitalictext.'12345678910六、总结本文详细介绍了正则表达式的基础知识、语法规则及高级特性,并结合实际案例展示了正则表达式在编程中的重要作用。通过掌握正则表达式,你可以更高效地处理文本数据,解决各种复杂的字符串匹配问题。
|
|