Python正则提取水果数量遇空值报错,如何优化匹配逻辑?
解决Python正则提取水果数量的问题
1. 问题根源
- 原正则未限制数字部分的长度,导致捕获到空字符串,转
int时触发报错 - 匹配逻辑边界模糊,误捕获了非目标内容(比如无数量的
Rettich)
2. 正则表达式优化
核心调整方向
- 强制数字部分为至少1位有效数字,彻底避免空匹配
- 限定水果名称的字符范围,减少无效匹配
- 用分组明确区分数量与水果名称
优化后的正则示例
假设文本格式为「数字 + 空格 + 水果名」(支持德语变音符号):
import re # 仅匹配带有效数字的条目 pattern = r'(\d+)\s+([A-Za-zäöüÄÖÜ]+)'
\d+:匹配1个及以上数字,确保不会捕获空字符串\s+:匹配1个及以上空白字符,兼容多空格分隔的情况[A-Za-zäöüÄÖÜ]+:限定水果名的字符范围,过滤非目标词汇
3. 代码逻辑加固
增加过滤与兜底处理
结合正则优化,再通过代码层过滤无效项、添加异常兜底:
def extract_fruit_quantity(text): pattern = r'(\d+)\s+([A-Za-zäöüÄÖÜ]+)' matches = re.findall(pattern, text) result = {} # 定义目标水果白名单,直接过滤非目标项 valid_fruits = {'Äpfel', 'Bananen', 'Kirschen', 'Erdbeeren'} for num_str, fruit in matches: try: quantity = int(num_str) if fruit in valid_fruits: # 处理重复水果的情况,比如多次出现取总和 result[fruit] = result.get(fruit, 0) + quantity except ValueError: # 极端情况兜底,理论上正则已保证num_str是有效数字 continue return result
兼容特殊格式场景
如果文本存在数量在后、带单位(如kg)的情况,可调整正则兼容:
# 兼容「数字+单位+水果」或「水果+数字」格式 pattern = r'(?:(\d+)\s*(?:kg|g)?\s+([A-Za-zäöüÄÖÜ]+)|([A-Za-zäöüÄÖÜ]+)\s+(\d+))'
对应代码处理逻辑:
for match in re.finditer(pattern, text): num_str = match.group(1) or match.group(4) fruit = match.group(2) or match.group(3) if num_str and fruit and fruit in valid_fruits: result[fruit] = result.get(fruit, 0) + int(num_str)
4. 测试验证
用包含异常的测试文本验证:
测试文本:
3 Äpfel, 5 Bananen, Rettich, Kirschen, 7 Erdbeeren
执行函数后返回:{'Äpfel': 3, 'Bananen': 5, 'Erdbeeren': 7},自动跳过无数量的Rettich和无有效数字的Kirschen
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

