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:批量验证文本模式(分类统计)
需求**:判断多个文本项是否符合特定正则模式,并将结果分类(如“有效”/“无效”)。
思路**:利用集合存储有效/无效的匹配结果,通过正则匹配快速分类填充。