核心内容摘要
第 176 场双周赛Q2——3839. 前缀连接组的数目
好的我们将从 Python 的模式匹配结构化模式匹配和正则表达式两个方面展开并结合工程实践中的高效用法。
内容会包含基础语法、高效技巧和简单
实践案例。
Python 的模式匹配Structural Pattern MatchingPython
10 引入了结构化模式匹配match-case它不仅能匹配值还能解构复杂的数据类型如列表、字典、类实例。
基础语法match subject: case pattern1: # 处理 pattern1 case pattern2 if condition: # 带条件的匹配 # 处理 pattern2 case _: # 通配符匹配任意值 # 默认处理高效实践技巧嵌套解构匹配多层数据结构如 JSON时可直接提取嵌套字段def parse_json(data): match data: case {type: user, name: str(name), age: int(age)}: return fUser: {name}, {age} years old case {type: post, content: str(content)}: return fPost: {content} case _: return Unknown data类型与值组合匹配同时匹配类型和特定值match value: case int(x) if x 100: print(Large integer:, x) case str(s) if error in s: print(Error message detected)
高效正则表达式Regex正则表达式适合处理非结构化的文本如日志、用户输入。
优化关键点在于减少回溯和提升可读性。
高效技巧预编译正则多次使用同一模式时用re.compile提升效率pattern re.compile(r\d{4}-\d{2}-\d{2}) # 预编译 dates pattern.findall(log_text)原子分组与非捕获组(?:...)避免捕获组的内存开销。
(?...)原子分组减少回溯提升性能# 匹配 IPv4 地址高效版 ip_pattern re.compile(r (?25[
]|2[
][
]|[01]?[
][
]?)\. # 原子分组优化 (?:25[
]|2[
][
]|[01]?[
][
]?)\.{3} , re.VERBOSE)避免贪婪匹配在复杂文本中贪婪匹配如.*易引发回溯。
优先用惰性匹配.*?或精确字符集# 提取 HTML 标签内容避免贪婪 re.findall(rdiv(.*?)/div, html_text) # 惰性匹配
工程
实践案例场景日志错误分析假设需要从日志中提取ERROR级别的消息和时间戳。
import re # 预编译正则含命名捕获组 log_pattern re.compile( r(?Ptimestamp\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (?PlevelERROR) - (?Pmessage.) ) def parse_log(log_line): match log_pattern.match(log_line): case None: return None case m: return { time: m.group(timestamp), message: m.group(message) } # 使用模式匹配处理不同日志类型 def handle_log_entry(entry): match parse_log(entry): case {time: t, message: msg} if timeout in msg: print(fTimeout at {t}: {msg}) case {time: t, message: msg}: print(fGeneral error at {t}: {msg}) case None: print(Invalid log entry)
四、
总结技术适用场景优势模式匹配结构化数据JSON、类、元组等可读性高支持深度解构正则表达式非结构化文本日志、文本提取灵活适合复杂模式匹配实践建议结构化数据优先用match-case。
文本解析用预编译正则并利用原子分组减少回溯。
避免“过度正则”能用字符串方法时如split()、startswith()则不引入正则。
通过组合两者可高效处理工程中的多样化数据解析需求。
好的我们将从 Python 的模式匹配结构化模式匹配和正则表达式两个方面展开并结合工程实践中的高效用法。
内容会包含基础语法、高效技巧和简单
实践案例。
Python 的模式匹配Structural Pattern MatchingPython
10 引入了结构化模式匹配match-case它不仅能匹配值还能解构复杂的数据类型如列表、字典、类实例。
基础语法match subject: case pattern1: # 处理 pattern1 case pattern2 if condition: # 带条件的匹配 # 处理 pattern2 case _: # 通配符匹配任意值 # 默认处理高效实践技巧嵌套解构匹配多层数据结构如 JSON时可直接提取嵌套字段def parse_json(data): match data: case {type: user, name: str(name), age: int(age)}: return fUser: {name}, {age} years old case {type: post, content: str(content)}: return fPost: {content} case _: return Unknown data类型与值组合匹配同时匹配类型和特定值match value: case int(x) if x 100: print(Large integer:, x) case str(s) if error in s: print(Error message detected)
高效正则表达式Regex正则表达式适合处理非结构化的文本如日志、用户输入。
优化关键点在于减少回溯和提升可读性。
高效技巧预编译正则多次使用同一模式时用re.compile提升效率pattern re.compile(r\d{4}-\d{2}-\d{2}) # 预编译 dates pattern.findall(log_text)原子分组与非捕获组(?:...)避免捕获组的内存开销。
(?...)原子分组减少回溯提升性能# 匹配 IPv4 地址高效版 ip_pattern re.compile(r (?25[
]|2[
][
]|[01]?[
][
]?)\. # 原子分组优化 (?:25[
]|2[
][
]|[01]?[
][
]?)\.{3} , re.VERBOSE)避免贪婪匹配在复杂文本中贪婪匹配如.*易引发回溯。
优先用惰性匹配.*?或精确字符集# 提取 HTML 标签内容避免贪婪 re.findall(rdiv(.*?)/div, html_text) # 惰性匹配
工程
实践案例场景日志错误分析假设需要从日志中提取ERROR级别的消息和时间戳。
import re # 预编译正则含命名捕获组 log_pattern re.compile( r(?Ptimestamp\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (?PlevelERROR) - (?Pmessage.) ) def parse_log(log_line): match log_pattern.match(log_line): case None: return None case m: return { time: m.group(timestamp), message: m.group(message) } # 使用模式匹配处理不同日志类型 def handle_log_entry(entry): match parse_log(entry): case {time: t, message: msg} if timeout in msg: print(fTimeout at {t}: {msg}) case {time: t, message: msg}: print(fGeneral error at {t}: {msg}) case None: print(Invalid log entry)
四、
总结技术适用场景优势模式匹配结构化数据JSON、类、元组等可读性高支持深度解构正则表达式非结构化文本日志、文本提取灵活适合复杂模式匹配实践建议结构化数据优先用match-case。
文本解析用预编译正则并利用原子分组减少回溯。
避免“过度正则”能用字符串方法时如split()、startswith()则不引入正则。
通过组合两者可高效处理工程中的多样化数据解析需求。