一文搞定 Python 正则表达式:常用场景速查表

简介: 本文通过20个实战案例详解Python正则表达式在邮箱验证、数据提取、文本处理等场景的应用,涵盖基础语法、高级技巧与性能优化,助你高效掌握这一字符串处理利器。

在Python编程中,正则表达式(Regular Expression,简称regex)是处理字符串的瑞士军刀。无论是数据清洗、日志分析,还是爬虫开发,正则表达式都能以简洁高效的方式解决复杂字符串匹配问题。本文通过20个真实场景案例,带你快速掌握正则表达式的核心用法。
探秘代理IP并发连接数限制的那点事 (62).png

一、基础验证场景

  1. 邮箱地址验证
    import re

def validateemail(email):
pattern = r'^[a-zA-Z0-9.
%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$'
return bool(re.match(pattern, email))

print(validate_email("test@example.com")) # True
print(validateemail("invalid.email")) # False
关键点:^和$确保从头到尾匹配,[a-zA-Z0-9.
%+-]匹配用户名部分,.转义点号,{2,}要求顶级域名至少2个字符。

  1. 手机号码校验(中国大陆)
    def validate_phone(phone):
    pattern = r'^1[3-9]\d{9}$'
    return bool(re.match(pattern, phone))

print(validate_phone("13800138000")) # True
print(validate_phone("12345678901")) # False
技巧:1[3-9]匹配运营商号段,\d{9}匹配剩余9位数字,总长度固定11位。

  1. 密码强度检测
    def validate_password(password):
    pattern = r'^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[@$!%?&])[A-Za-z\d@$!%?&]{8,20}$'
    return bool(re.match(pattern, password))

print(validate_password("StrongPass1!")) # True
print(validate_password("weakpass")) # False
原理:(?=...)是正向预查,确保同时包含大小写字母、数字和特殊字符,{8,20}限制长度。

二、数据提取场景

  1. 从文本提取所有数字
    text = "订单号: 2023A001, 金额: ¥128.50"
    numbers = re.findall(r'\d+.?\d*', text)
    print(numbers) # ['2023', '001', '128.50']
    扩展:若需提取整数,改用r'\b\d+\b';提取小数用r'\d+.\d+'。

  2. 抓取网页URL
    html = '链接 '
    urls = re.findall(r'href="(https?://[^"]+)"', html)
    print(urls) # ['https://example.com']
    优化:添加re.IGNORECASE标志可匹配HTTP和HTTPS混合大小写情况。

  3. 解析日志文件
    log = "2023-10-01 12:00:00 ERROR: Disk full"
    match = re.search(r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (\w+): (.+)', log)
    if match:
    print(f"日期: {match.group(1)}, 时间: {match.group(2)}, 级别: {match.group(3)}, 内容: {match.group(4)}")
    输出:
    日期: 2023-10-01, 时间: 12:00:00, 级别: ERROR, 内容: Disk full
    三、文本处理场景

  4. 敏感词过滤
    def censor_text(text, bad_words):
    pattern = '|'.join(map(re.escape, bad_words))
    return re.sub(pattern, '*', text)

text = "这个产品太糟糕了,服务态度极差"
print(censor_text(text, ["糟糕", "极差"])) # 这个产品太了,服务态度
注意:re.escape自动转义特殊字符,避免正则语法错误。

  1. 拆分复合分隔符
    data = "苹果|香蕉,橙子;西瓜"
    items = re.split(r'[|,;]', data)
    print(items) # ['苹果', '香蕉', '橙子', '西瓜']
    应用场景:处理CSV文件或用户自定义分隔符的数据。

  2. 删除多余空格
    text = " This is a messy sentence. "
    cleaned = re.sub(r'\s+', ' ', text).strip()
    print(cleaned) # "This is a messy sentence."
    进阶:结合re.compile()预编译模式提升性能:

space_pattern = re.compile(r'\s+')
cleaned = space_pattern.sub(' ', text).strip()
四、高级匹配技巧

  1. 非贪婪匹配
    html = "

    第一段

    第二段

    "
    content = re.findall(r'

    (.?)

    ', html, re.DOTALL)
    print(content) # ['第一段', '第二段']
    对比:贪婪模式.
    会匹配整个字符串,非贪婪模式.*?在遇到第一个时停止。
  2. 条件匹配(区分邮箱类型)
    emails = ["edu@example.edu", "biz@example.biz"]
    for email in emails:
    match = re.search(r'(\w+@)(edu|biz).', email)
    if match:

    print(f"{email} 是{match.group(2)}邮箱")
    

    输出:

edu@example.edu 是edu邮箱
biz@example.biz 是biz邮箱

  1. 提取重复字符
    text = "1122334455"
    repeats = re.findall(r'(\d)\1+', text)
    print(repeats) # ['1', '2', '3', '4', '5']
    原理:(\d)捕获数字,\1引用第一个分组,+匹配一次或多次重复。

五、实战案例集锦

  1. 身份证号校验(简易版)
    def validate_id_card(id_card):
    pattern = r'^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$'
    return bool(re.match(pattern, id_card))

print(validate_id_card("11010519991231003X")) # True
说明:该模式验证18位身份证号,包含地区码、出生日期和校验位。

  1. 提取中文段落
    text = "Hello 你好,世界!This is a test."
    chinese = re.findall(r'[\u4e00-\u9fa5]+', text)
    print(chinese) # ['你好', '世界']
    扩展:匹配中文标点:r'[\u4e00-\u9fa5,。、;:?!]'

  2. 爬虫代理IP格式校验
    def validate_proxy(proxy):
    pattern = r'^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:\d{1,5}$'
    return bool(re.match(pattern, proxy))

print(validate_proxy("192.168.1.1:8080")) # True
print(validate_proxy("256.300.1.1:99999")) # False

注意:实际IP范围需更严格校验,此处仅演示格式。

六、性能优化建议

date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}$')
date_pattern.match("2023-10-01")

只需判断是否存在匹配 → re.search()
需要所有匹配结果 → re.findall()
需要替换文本 → re.sub()

常见问题Q&A
Q2:如何匹配中文和英文混合字符串中的中文部分?
A:使用Unicode范围匹配:

text = "Python编程 Python Programming"
chinese = re.findall(r'[\u4e00-\u9fa5]+', text)
print(chinese) # ['编程']

Q3:正则表达式匹配效率低如何优化?
A:

避免嵌套量词(如(a+)+)
使用非贪婪模式替代贪婪模式
限制重复次数范围(如{3,6}优于*)
对固定字符串使用re.escape()转义后直接匹配
Q4:如何提取HTML标签间的文本?
A:非贪婪模式匹配:

html = "

标题

内容

"
texts = re.findall(r'>(.*?)</', html)
print(texts) # ['标题', '内容']

Q5:正则表达式能匹配二进制数据吗?
A:不能直接匹配,但可先解码为字符串(如UTF-8),或使用bytes类型正则(Python 3中需加b前缀):

binary_data = b'\x48\x65\x6c\x6c\x6f'
pattern = b'Hello'
match = re.search(pattern, binary_data)

通过掌握这些核心场景和优化技巧,你已具备解决80%以上字符串处理问题的能力。正则表达式的精髓在于"用简洁的语法描述复杂规则",建议通过实际项目不断练习,最终达到"看字符串即写正则"的境界。

目录
相关文章
|
9天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
305 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
318 155
|
12天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
873 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
258 113

热门文章

最新文章