python 正则集合

admin 105 0
Python的re模块提供了强大的正则表达式功能集合,支持模式匹配、文本搜索与替换等操作,核心功能包括compile()编译正则模式、match()和search()实现精准定位,findall()与finditer()提取所有匹配结果,sub()完成文本替换,支持元字符(如.、*、?)、分组、预查等高级语法,可灵活处理字符串匹配、数据清洗、信息提取等场景,通过正则表达式,能高效解决复杂文本处理需求,是Python文本分析的重要工具。

Python正则与集合的协同艺术:高效文本处理的实战指南

在Python数据处理的世界里,正则表达式(Regular Expression)与集合(Set)堪称两大“利器”,正则表达式精于文本模式的精准匹配与提取,集合则在去重、关系运算等场景中展现高效优势,当二者强强联手,便能产生“1+1>2”的化学反应——既实现文本模式的精确捕获,又能对匹配结果进行高效的集合化操作,本文将带你从基础到实战,深入掌握Python中正则表达式与集合的协同应用之道。

基石回顾:正则表达式与集合的核心能力

正则表达式:文本模式匹配的“瑞士军刀”

正则表达式通过一套精炼的语法规则描述字符串模式,Python的re模块提供了强大的支持,其核心功能涵盖:

  • 匹配re.match()(从字符串起始位置匹配)、re.search()(全局搜索首个匹配)
  • 提取re.findall()(返回所有匹配结果的列表)、re.finditer()(返回匹配对象的迭代器)
  • 替换re.sub()(替换所有匹配文本)
  • 分割re.split()(按匹配模式分割字符串)
  • 预编译优化re.compile()(将正则表达式预编译为模式对象,提升重复匹配效率)

**示例:** 从文本中提取所有数字:

import re
text = "订单号:12345,金额:678.9,电话:13812345678"
numbers = re.findall(r"\d+", text)  # 返回列表: ['12345', '678', '13812345678']

集合:高效去重与关系运算的基石

集合是Python中一种无序、不重复的元素容器,其核心优势在于:

  • 自动去重set()构造函数可一键去除列表、元组等可迭代对象中的重复元素
  • 关系运算:支持并集( 或 union())、交集(&intersection())、差集( 或 difference())、对称差集(^symmetric_difference()
  • 高效查询in操作的时间复杂度为O(1),显著优于列表的O(n)
  • 集合推导式:支持类似列表推导式的简洁语法:{x for x in iterable if condition}
  • 不可变集合frozenset()提供不可变版本的集合,可作为字典键或集合元素

**示例:** 快速去重并求交集:

list1 = [1, 2, 2, 3, 4]
list2 = [3, 4, 4, 5, 6]
set1 = set(list1)  # {1, 2, 3, 4}
set2 = set(list2)  # {3, 4, 5, 6}
common = set1 & set2  # {3, 4}
# 或使用方法: common = set1.intersection(set2)

强强联合:正则与集合的三大核心应用场景

正则表达式匹配文本后,结果往往需要进一步处理(如去重、分类、统计),此时集合的特性便大放异彩,以下是三大典型且高效的协同应用场景:

场景1:从海量文本中提取唯一匹配项(去重+过滤)

需求:从大量文本数据中提取符合特定模式的内容,并自动去除重复项。
思路:利用正则表达式匹配所有目标内容,将结果直接转换为集合实现自动去重,再根据需要转回列表或集合使用。

案例**:从服务器日志中提取所有唯一访问的IP地址(IPv4)

import re
logs = """
192.168.1.1 - - [10/Oct/2023:13:55:36 +0800] "GET /index.html HTTP/1.1" 200 1024
10.0.0.1 - - [10/Oct/2023:13:56:12 +0800] "POST /api/login HTTP/1.1" 200 512
192.168.1.1 - - [10/Oct/2023:13:57:05 +0800] "GET /home.html HTTP/1.1" 200 2048
10.0.0.2 - - [10/Oct/2023:13:58:22 +0800] "GET /api/data HTTP/1.1" 404 256
"""
# 预编译正则模式(提升性能,尤其适合大文本或多次匹配)
ip_pattern = re.compile(r"\b(?:\d{1,3}\.){3}\d{1,3}\b")
# 匹配所有IP地址(返回列表)
all_ips = ip_pattern.findall(logs)  # ['192.168.1.1', '10.0.0.1', '192.168.1.1', '10.0.0.2']
# 转换为集合自动去重
unique_ips = set(all_ips)  # {'192.168.1.1', '10.0.0.1', '10.0.0.2'}
print("唯一访问IP地址:", unique_ips)

优势**:相比手动去重(如遍历列表+条件判断),集合去重代码更简洁、性能更高(O(n)时间复杂度),尤其适合处理大规模匹配结果。

场景2:批量验证文本模式(分类统计)

需求**:判断多个文本项是否符合特定正则模式,并将结果分类(如“有效”/“无效”)。
思路**:利用集合存储有效/无效的匹配结果,通过正则匹配快速分类填充。

标签: #正则 #集合