玩转Python爬虫中的正则表达式:从原理到实战!

🔸 正则表达式原理概述

正则表达式(Regular Expression,简称RE)是一种用于匹配文本的强大工具。它通过一些特殊字符(称为元字符)和模式,能够在文本中进行搜索、替换和解析操作。Python中的re模块提供了对正则表达式的支持,使我们可以方便地进行文本处理。


🔸 通用符号学习:各种元字符

让我们先来学习一些常见的元字符及其含义:

  • . :匹配除换行符外的任意字符
  • ^ :匹配字符串的开头
  • $ :匹配字符串的结尾
  • * :匹配前面的字符零次或多次
  • + :匹配前面的字符一次或多次
  • ? :匹配前面的字符零次或一次
  • {n} :匹配前面的字符恰好n次
  • {n,} :匹配前面的字符至少n次
  • {n,m} :匹配前面的字符至少n次,但不超过m次
  • [] :匹配方括号内的任意字符
  • | :匹配左右任意一个表达式
  • () :标记一个子表达式,用于分组和提取

🔹 常见的转义字符:

  • \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]

🔸 分组和通用匹配

在正则表达式中,使用圆括号()可以对模式进行分组,这样我们可以提取匹配的子字符串。

python 复制代码
import re

pattern = r"(\d{4})-(\d{2})-(\d{2})"
text = "2024-07-31"
match = re.match(pattern, text)
if match:
    year, month, day = match.groups()
    print(f"Year: {year}, Month: {month}, Day: {day}")

🔹 在这个示例中,模式 (\d{4})-(\d{2})-(\d{2}) 匹配日期格式 YYYY-MM-DD,并将年、月、日分别分组。


🔸 贪婪和非贪婪模式

正则表达式中的*+?等量词默认是贪婪的,即尽可能多地匹配字符。我们可以通过在量词后加上?来将其变为非贪婪模式,即尽可能少地匹配字符。

python 复制代码
import re

text = "<div>content</div><div>more content</div>"
pattern_greedy = r"<div>.*</div>"
pattern_non_greedy = r"<div>.*?</div>"

# 贪婪模式
greedy_match = re.findall(pattern_greedy, text)
print(f"Greedy match: {greedy_match}")

# 非贪婪模式
non_greedy_match = re.findall(pattern_non_greedy, text)
print(f"Non-greedy match: {non_greedy_match}")

🔹 在这个示例中,贪婪模式匹配了整个字符串,而非贪婪模式则分别匹配了每个<div>标签中的内容。


🔸 findall、match和search方法

Python的re模块提供了多种方法来进行正则表达式匹配:

  1. re.findall(pattern, string):返回所有与模式匹配的子串列表。
python 复制代码
import re

text = "There are 3 cats, 5 dogs, and 7 birds."
pattern = r"\d+"
matches = re.findall(pattern, text)
print(f"Numbers found: {matches}")
  1. re.match(pattern, string):从字符串的起始位置开始匹配模式,成功则返回Match对象,否则返回None
python 复制代码
import re

text = "2024-07-31"
pattern = r"\d{4}-\d{2}-\d{2}"
match = re.match(pattern, text)
if match:
    print(f"Matched: {match.group()}")
  1. re.search(pattern, string):搜索整个字符串,找到第一个与模式匹配的子串,成功则返回Match对象,否则返回None
python 复制代码
import re

text = "Contact us at support@example.com"
pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
match = re.search(pattern, text)
if match:
    print(f"Email found: {match.group()}")

🔸 总结

🔹 通过这次学习,我们掌握了正则表达式的基本原理、常用元字符、分组与匹配、贪婪与非贪婪模式,以及re模块中的常用方法。正则表达式在爬虫中非常实用,可以帮助我们高效地提取和处理文本数据。希望大家能够熟练掌握这些技巧,在实际项目中灵活运用!

相关推荐
艾派森几秒前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、26 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen1 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁2 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev2 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子2 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python3 小时前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习