如何修正正则表达式以提取指定商品文本前的数字?
问题解决:提取商品描述前的数字
原代码问题分析
你当前的代码逻辑完全错误:用([0-9]+)拼接fruit_words列表,会生成类似Appels([0-9]+)Bananas([0-9]+)Oranges的正则表达式,这是在匹配水果词之间的数字,而非你需要的水果词前方的数字,所以返回空列表是必然的。
修正后的代码实现
核心思路
构建正则表达式,匹配「数字 + 空格 + 任意一个水果词」的组合,捕获其中的数字部分。为避免水果词含特殊正则字符(比如.、*)导致匹配失败,建议对每个水果词做转义处理。
代码示例
import re # 示例数据 verdi = "222 Appels Royal Gala 13kg 60/65 Generica PL Klasse I\n33 Bananas Cavendish 10kg" fruit_words = ["Appels", "Bananas"] # 构建正则模式:转义每个水果词,用|分隔表示可选,匹配数字+空格+水果词的组合 pattern = r'(\d+)\s+(?:' + '|'.join(re.escape(word) for word in fruit_words) + ')' number_found = re.findall(pattern, verdi) print(number_found) # 输出:['222', '33']
模式说明
(\d+):捕获一个或多个数字(这就是你要的目标值)\s+:匹配一个或多个空格(数字和商品词之间的分隔)(?:...):非捕获组,用来包裹所有可选的水果词,避免额外捕获无关内容|.join(...):将水果列表转成「词1|词2|词3」的形式,表示匹配任意一个水果词
补充说明
如果你的发票文本中数字和商品词之间可能存在其他空白字符(比如制表符),可以把\s+换成\s*(匹配0或多个空白),或者[\s\t]+(匹配空格或制表符)。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

