正则表达式实战教程:从语法到Python爬虫匹配,附工具推荐与案例源码

admin 综合编程开发技术 3


用 Python 写爬虫的朋友是不是总在正则匹配这一步卡壳?明明网页里有想要的手机号、邮箱,正则写了半天就是匹配不到;好不容易匹配到内容,却把无关的广告文字也抓了进来;更头疼的是,网上抄的正则在工具里能用,放到代码里就报错,反复检查也找不到问题在哪。别着急,兔子哥太懂这种感受了!第一次用正则爬取商品价格时,就因为没搞懂贪婪模式,结果把 “¥99 限时特惠” 匹配成了 “¥99 限时特惠 ¥199 原价”,多抓了一堆没用的内容;还有一次想提取网页链接,正则写得太复杂,改一个符号就全乱了,折腾到半夜才搞定。今天就带大家从基础语法讲到 Python 爬虫实战,再推荐实用工具和案例源码,新手跟着学,正则匹配再也不踩坑,一起往下看吧!

一、实战必备语法:6 个核心符号,爬虫匹配全靠它


基础问题:正则符号那么多,哪些是爬虫必须掌握的?


正则符号虽然多,但爬虫常用的也就几个,新手不用死记所有符号,先吃透这 6 个,大部分匹配场景都能应付。
符号 / 语法作用爬虫常用场景示例
.匹配任意单个字符(除换行)模糊匹配未知内容a.b匹配acba1ba@b
\d匹配任意数字(0-9)提取手机号、价格、ID\d{11}匹配 11 位手机号
\w匹配字母、数字、下划线提取用户名、标签名user_\w+匹配user_001user_admin
*前面字符出现 0 次或多次匹配可变长度内容ab*c匹配acabcabbc
+前面字符出现 1 次或多次匹配至少有一个的内容\w+@\w+匹配abc@163x_y@qq
()分组提取提取标签内或特定格式的内容

(.*?)

提取 h1 标签里的文本

兔子哥提醒:这些符号看着简单,但组合起来威力很大。比如提取邮箱的正则\w+@\w+\.\w+,就是用\w+匹配用户名和域名,\.匹配点(注意点要转义成\.),组合起来就能精准匹配邮箱格式。

必学进阶技巧:贪婪与非贪婪模式


正则默认是贪婪模式,会尽可能多匹配内容,比如用.(.*)提取网页标题,可能会匹配到整个网页的内容。这时候只要在*后面加个?,变成(.*?),就能启用非贪婪模式,匹配到第一个就停止,正好提取标题内容。爬虫里处理标签内容时,非贪婪模式几乎是必用的,新手一定要记牢。


二、Python 爬虫中的正则:re 模块 4 个核心函数,实战用法详解


基础问题:Python 里怎么用正则?和普通正则有啥区别?


Python 里用正则要靠内置的re模块,核心语法和通用正则一样,但函数用法有自己的特点。新手只要掌握 4 个函数,爬虫匹配基本就够用了。

re 模块核心函数实战


  1. re.findall(pattern, string):提取所有匹配内容,返回列表
    最常用的函数,比如从网页文本里提取所有手机号,一行代码就能搞定:
    python
    import retext = "用户1手机号:13812345678,用户2手机号:13987654321"phones = re.findall(r'\d{11}', text)print(phones)  # 结果:['13812345678', '13987654321']

  2. re.search(pattern, string):提取第一个匹配内容,返回匹配对象
    适合只要一个结果的场景,比如提取网页标题,找到第一个匹配就够了,需要用.group()获取内容:
    python
    html = "正则表达式实战教程"result = re.search(r'(.*?)', html)if result:  # 一定要判断是否匹配到,否则可能报错print(result.group(1))  # 结果:正则表达式实战教程

  3. re.compile(pattern):编译正则,重复使用更高效
    爬大量页面时,先编译正则能节省时间,不用每次匹配都解析规则:
    python
    pattern = re.compile(r'\w+@\w+\.\w+')  # 编译邮箱正则text1 = "邮箱1:abc@qq.com"text2 = "邮箱2:xy_z@163.com"print(pattern.findall(text1))  # ['abc@qq.com']print(pattern.findall(text2))  # ['xy_z@163.com']

  4. re.sub(pattern, repl, string):替换匹配内容,清洗数据
    爬取的内容常有多余空格、换行,用这个函数一键清洗:
    python
    dirty_text = "  提取的文本  \n  有很多空格和换行  "clean_text = re.sub(r'\s+', ' ', dirty_text).strip()  # 替换空格和换行为单个空格,再去首尾空格print(clean_text)  # 结果:提取的文本 有很多空格和换行


网友 “爬虫新手小周” 分享:“之前爬 100 页数据,每次都写一遍正则,速度特别慢。后来用了re.compile,先编译再匹配,速度快了差不多一倍,原来编译正则这么重要!”

三、实战案例:3 个爬虫场景手把手教,附完整源码


案例 1:爬取网页中的所有邮箱地址


步骤:
  1. 分析邮箱格式:用户名@域名.后缀,正则用r'\w+@\w+\.\w+'
  2. 发送请求获取网页内容,用re.findall提取所有邮箱。
  3. 完整源码:

python
import reimport requests# 目标网页(示例)url = "https://www.example.com/contact"response = requests.get(url)html_text = response.text  # 获取网页文本# 提取所有邮箱emails = re.findall(r'\w+@\w+\.\w+', html_text)# 打印结果print("提取到的邮箱:")for email in emails:print(email)

案例 2:提取电商网页中的商品价格(格式:¥xx.xx)


步骤:
  1. 分析价格格式:¥开头,后面跟数字和可能的小数点,正则用r'¥(\d+\.?\d*)'(括号分组提取数字部分)。
  2. 提取后可以转换成浮点数,方便后续处理。
  3. 完整源码:

python
import re# 模拟电商网页文本html_text = """商品1:¥99.90商品2:¥199商品3:¥299.50"""# 提取价格(分组提取数字部分)prices = re.findall(r'¥(\d+\.?\d*)', html_text)# 转换为浮点数并打印print("商品价格:")for price in prices:print(f"¥{float(price):.2f}")  # 保留两位小数

案例 3:清洗爬取的标题文本,去除多余标签和空格


步骤:
  1. 爬取的标题常包含

    等标签,先用正则提取标签内的文本。
  2. 再用re.sub替换多余空格和换行。
  3. 完整源码:

python
import re# 模拟爬取的带标签文本dirty_title = "  

正则表达式实战教程 - 零基础入门

\n "
# 提取标签内的文本title_without_tag = re.findall(r'

(.*?)

'
, dirty_title)[0] # 取第一个匹配# 清洗空格和换行clean_title = re.sub(r'\s+', ' ', title_without_tag).strip()print("清洗后的标题:", clean_title) # 结果:正则表达式实战教程 - 零基础入门



四、实用工具推荐:3 个神器帮你写正则、查错误


1. 在线正则测试工具


搜 “正则表达式测试工具”,随便打开一个(比如菜鸟教程的正则测试工具),输入文本和正则,能实时显示匹配结果,还能标红匹配位置。写正则时先用它测试,能少踩很多坑,新手必备。

2. RegExr(带语法提示的在线工具)


这个工具不仅能测试正则,还会显示每个符号的含义,比如输入\d,会提示 “匹配数字”。写复杂正则时,它能帮你理清每个部分的作用,特别适合新手学习。

3. Python 正则调试库(re_debug)


在 Python 代码里加re.DEBUG参数,能打印正则的解析过程,比如:
re.compile(r'\d{11}', re.DEBUG)
会输出解析步骤,帮你找到正则写错的地方,适合代码级别的调试。
兔子哥个人推荐:新手先用在线测试工具写正则,确认能匹配后再放到 Python 代码里,效率会高很多。遇到匹配失败,先用在线工具对比文本和正则,大部分错误都能这样找到。

五、避坑指南:爬虫正则最容易踩的 5 个错


  1. 转义字符漏写,匹配失败
    在 Python 里直接写'\d{11}'\d会被当成转义字符,实际生效的是d,导致匹配不到数字。解决:在字符串前加r,写成r'\d{11}',表示原始字符串,不用额外转义。
  2. 贪婪模式没控制,匹配内容过多
    r'(.*)'提取链接,结果匹配了整个网页的到最后一个。解决:加?启用非贪婪模式,r'(.*?)',只匹配到第一个
  3. 忽略网页大小写,标签匹配不到
    网页标签可能有大写(比如),正则r'匹配不到。解决:加re.IGNORECASE参数,re.findall(r',忽略大小写。
  4. 没考虑换行符,跨多行匹配失败
    目标内容跨多行时(比如\n内容\n),.不匹配换行,导致匹配失败。解决:加re.DOTALL参数,re.search(r'(.*?)', html, re.DOTALL),让.匹配换行。
  5. 正则太复杂,不如用解析库
    复杂网页(比如嵌套多层标签的 HTML)用正则很难精准匹配,还容易出错。解决:简单内容用正则,复杂结构用 BeautifulSoup,两者结合效率更高,别硬扛。

六、自问自答:实战中常问的问题


“正则和 BeautifulSoup 哪个更适合爬虫?什么时候该用正则?”
没有绝对的好坏!简单场景(提取手机号、邮箱、单标签内容)用正则更快更简洁;复杂场景(嵌套标签、动态加载内容)用 BeautifulSoup 更省心,它能直接定位标签。新手建议两者都学,灵活搭配使用。
“写正则有没有捷径?记不住符号怎么办?”
捷径就是多练!刚开始可以建个 “正则符号笔记”,把常用符号和例子记下来,忘了就翻一翻。写正则时先在脑子里拆分成小部分,比如提取价格拆成 “匹配 ¥”“匹配数字”“匹配小数点”,再组合起来,比直接写完整正则容易多了。
“为什么同样的正则,在不同网页效果不一样?”
因为网页结构可能不同!比如有的网页价格是¥99,有的是,正则需要根据实际结构调整。爬新网页时,先看网页源码,再针对性写正则,别直接套用旧规则。

结尾心得


正则表达式在爬虫里是 “利器”,但用不好就容易变成 “坑器”。兔子哥的经验是,新手别一开始就追求复杂正则,从简单的提取手机号、邮箱练起,熟练后再挑战标签内容提取;写正则时多利用在线工具测试,确认没问题再放到代码里;遇到匹配失败,先检查转义、贪婪模式和参数是否正确,大部分问题都能这样解决。正则和解析库不是对立的,该用正则时别犹豫,该用解析库时别硬撑。多爬几个网页,多踩几次坑,你会发现正则匹配越来越顺手,爬虫效率也会提高一大截。记住,实战是最好的老师,动手练起来比啥都重要,加油!

标签: 第一次 是不是

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~