Python正则:从字符串列表提取指定内容并生成元组列表
问题分析与解决方案
首先得说,你这个需求的核心是把单条字符串里的三类信息精准提取后对应成元组,现有代码的问题主要是正则的匹配范围写错了(用了^和$限制成了匹配整个字符串,这显然不对),还有没把每个正则的结果对应打包成元组。下面给你一个更简洁且符合需求的实现:
完整代码实现
import re def extract_target_info(strings, keywords): final_list = [] # 预编译正则,避免循环里重复编译,提升效率 # 关键词正则:转义关键词防止特殊字符干扰,匹配完整单词且忽略大小写 keyword_re = re.compile(r'\b(' + '|'.join(re.escape(k) for k in keywords) + r')\b', re.IGNORECASE) # 货币正则:匹配$、£、€开头的价格,支持千分位和小数 price_re = re.compile(r'[\$\£\€]\s?\d{1,3}(?:[.,]\d{3})*(?:[.,]\d{1,2})?') # 小于10的数字正则:匹配1-9的整数,或1-9开头的小数(排除10及以上) number_re = re.compile(r'\b(?!10\b)\d(?:\.\d{1,2})?\b') for s in strings: # 提取关键词:取第一个匹配项,无则为空 keyword_match = keyword_re.search(s) keyword = keyword_match.group() if keyword_match else '' # 提取价格:取第一个匹配项,无则为空 price_match = price_re.search(s) price = price_match.group().rstrip('.') if price_match else '' # 去掉价格末尾多余的点 # 提取小于10的数字:取第一个匹配项,无则为空 number_match = number_re.search(s) number = number_match.group() if number_match else '' # 将三个结果打包成元组加入列表 final_list.append((keyword, price, number)) return final_list # 测试你的示例数据 keywords = ['Turin', 'Milan' , 'Nevada'] strings = [ 'This is a sentence about Turin with 5 and $10.00 in it.', ' 2.5 Milan is a city with £1,000 in it.', 'Nevada and $1,100,000. and 10.09' ] print(extract_target_info(strings, keywords))
关键细节说明
- 正则修正:
- 去掉了原正则里的
^和$,这样才能在字符串任意位置匹配目标内容; - 关键词用
re.escape转义,避免关键词里有.、*这类正则特殊字符导致匹配失败; - 数字正则用负前瞻
(?!10\b)排除了10这个刚好等于10的数,确保只提取小于10的数字。
- 去掉了原正则里的
- 结果处理:每个字符串单独提取三类信息,用
search取第一个匹配结果(你的示例里每条字符串只有一个对应项),没有匹配到就用空字符串填充,完美对应你要的元组格式。 - 效率优化:提前编译正则表达式,处理大量字符串时比循环里重复编译快很多。
运行结果
执行代码后会输出和你期望完全一致的结果:
[('Turin', '$10.00', '5'), ('Milan', '£1,000', '2.5'), ('Nevada', '$1,100,000', '')]
完全不需要拆分单词后再查找匹配,正则本身就能高效完成完整单词的匹配工作,这样的实现更简洁直接。
内容的提问来源于stack exchange,提问作者JRR
相关产品推荐
相关产品推荐

