【愚公系列】《Python网络爬虫从入门到精通》011-使用findall()进行匹配

举报
愚公搬代码 发表于 2025/04/30 23:53:03 2025/04/30
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容 .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎 👍点赞、✍评论、⭐收藏

🚀前言

在数据处理和文本分析的过程中,字符串匹配是一个常见而重要的任务。Python的正则表达式库提供了多种匹配工具,其中findall()函数因其强大的功能和简单的用法,成为了许多开发者和数据分析师的得力助手。与其他匹配方法相比,findall()能够在给定字符串中找到所有符合条件的匹配项,极大地方便了我们对数据的全面提取和分析。

在本期文章中,我们将深入探讨findall()函数的使用方法及其应用场景。我们将介绍findall()的基本语法、常见参数,以及与其他匹配方法(如search()和match())的区别。通过具体的实例,我们将展示如何利用findall()函数高效地提取文本中的所有匹配内容,帮助你提升数据处理的效率和准确性。

🚀一、使用findall()进行匹配

方法作用
re.findall() 在字符串中搜索所有符合正则表达式的子串,返回包含所有匹配结果的列表(无匹配时返回空列表)。
语法格式

re.findall(pattern, string, flags=0)

参数说明

  • pattern: 正则表达式(字符串形式)
  • string: 待匹配字符串
  • flags: 修饰符(可选,如re.I忽略大小写)

🔎1.匹配所有指定字符开头的字符串

import re
pattern = 'mr_\w+'                        # 模式字符串
string = 'MR_SHOP mr_shop'                # 要匹配的字符串
match = re.findall(pattern,string,re.I)  # 搜索字符串,不区分大小写
print(match)                                # 输出匹配结果
string = '项目名称MR_SHOP mr_shop'
match = re.findall(pattern,string)        # 搜索字符串,区分大小写
print(match)                                # 输出匹配结果

关键点

  • re.I修饰符使匹配不区分大小写。
  • 未使用修饰符时,严格按大小写匹配。
在这里插入图片描述在这里插入图片描述

🔎2.贪婪匹配(.*

import re                        # 导入re模块
pattern = 'https://.*/'               # 表达式,“.*”获取www.hao123.com
match = re.findall(pattern,'https://www.hao123.com/')  # 匹配字符串
print(match)                            # 打印匹配结果

import re                        # 导入re模块
pattern = 'https://(.*)/'               # 表达式,“.*”获取www.hao123.com
match = re.findall(pattern,'https://www.hao123.com/')  # 匹配字符串
print(match)                            # 打印匹配结果

关键点

  • .*为贪婪匹配,会匹配到最后一个符合条件的字符。
  • 使用(.*)分组可提取特定部分。
在这里插入图片描述在这里插入图片描述

🔎3.非贪婪匹配(.*?

import re                        # 导入re模块
pattern = 'https://.*(\d+).com/'               # 表达式,“.*”获取www.hao123.com
match = re.findall(pattern,'https://www.hao123.com/')  # 匹配字符串
print(match)                            # 打印匹配结果

import re                        # 导入re模块
pattern = 'https://.*?(\d+).com/'               # 表达式,“.*”获取www.hao123.com
match = re.findall(pattern,'https://www.hao123.com/')  # 匹配字符串
print(match)                            # 打印匹配结果

import re                        # 导入re模块
pattern = 'https://(.*?)'               # 表达式,“.*?”获取www.hao123.com/
match = re.findall(pattern,'https://www.hao123.com/')  # 匹配字符串
print(match)                            # 打印匹配结果
pattern = 'https://(.*)'               # 表达式,“.*”获取www.hao123.com/
match = re.findall(pattern,'https://www.hao123.com/')  # 匹配字符串
print(match)                            # 打印匹配结果

关键点

  • .*?为非贪婪匹配,尽可能少匹配字符。
  • 非贪婪匹配可能导致尾部匹配失败,需根据场景选择。
在这里插入图片描述在这里插入图片描述

🔎4.贪婪 vs 非贪婪对比

场景 正则表达式 匹配结果 说明
提取中间数字 .*(\d+).com ['3'] 贪婪匹配吞掉大部分字符
提取中间数字 .*?(\d+).com ['123'] 非贪婪精准定位目标
提取URL域名 (.*?) ['www.hao123.com/'] 非贪婪可能提前结束
提取URL域名 (.*) ['www.hao123.com/'] 贪婪匹配完整内容

🔎5.注意事项

  1. 正则表达式模式
    • 使用原始字符串(r'')避免转义错误。
    • 贪婪匹配(.*)适用于提取尾部内容,非贪婪匹配(.*?)适用于精准定位中间内容。
  2. findall()特性
    • 返回所有匹配结果的列表,无分组时返回完整匹配,有分组时返回分组内容。
  3. 修饰符的作用
    • re.Ire.M等修饰符需根据需求添加。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。