You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3中高效移除字符串指定词汇的方法咨询

提取食材名称的高效Python实现方案

看起来你现在需要从食材字符串里提取核心的食材名称,比如从"2 cup butter, softened"里拿到butter,之前用多次replace的方式不仅麻烦,还遇到了正则报错的问题对吧?我来给你几个更高效的方案,顺便帮你排查下报错的原因。

一、先说说你遇到的正则报错原因

你贴的报错信息里sre_constants.error: unknown extension ?| at position 23,这说明你写的正则表达式里有语法错误——?|是不合法的正则语法,大概率是你在构建匹配模式的时候,把可选分支的写法搞错了,正确的分支写法应该是用括号包裹,比如(cup|cups|tablespoon...),而不是错误的?|组合。

二、高效提取食材的几种方案

1. 正则表达式一次性移除所有无关内容

既然你需要处理多种单位(cup、cups、tablespoons、teaspoon等)和数量、描述词,最直接的就是用正则把这些不需要的内容全部匹配并替换掉。

比如先定义所有需要移除的关键词(数量、单位、描述词),然后构建一个正则模式:

import re

ing = "2 cup butter, softened"
# 定义要移除的内容:数字、单位、常见描述词,用|分隔
pattern = r'\d+|cup|cups|tablespoon|tablespoons|teaspoon|teaspoons|softened|, '
# 替换为空,然后strip去掉前后空格
ingredient = re.sub(pattern, '', ing).strip()
print(ingredient)  # 输出: butter

这个方案的好处是可以一次性处理所有需要移除的词汇,不用多次调用replace,而且可以很方便地扩展关键词列表,比如以后要加ounce、grated这类词,直接加到pattern里就行。

2. 分割字符串提取核心食材

如果你的食材字符串格式比较固定(数量+单位+食材+描述),也可以用分割的方式:

ing = "2 cup butter, softened"
# 按空格分割成列表,跳过前两个元素(数量和单位),然后取到逗号前的部分
parts = ing.split()
# 从第三个元素开始拼接,直到遇到逗号为止
ingredient = ' '.join([part for part in parts[2:] if ',' not in part])
print(ingredient)  # 输出: butter

这种方法适合格式比较统一的情况,不需要正则,代码更直观。

3. 进阶:用正则匹配食材核心部分

如果有些食材名称是多个单词(比如"1 cup unsalted butter, melted"),上面的方法可能需要调整,这时候可以用正则直接匹配食材部分:

import re

ing = "1 cup unsalted butter, melted"
# 匹配数字+单位之后,到逗号之前的内容
pattern = r'\d+ \w+ (.+?),'
match = re.search(pattern, ing)
if match:
    ingredient = match.group(1).strip()
    print(ingredient)  # 输出: unsalted butter

这种方法可以提取多单词的食材名称,适配更复杂的情况。

三、优化建议

  • 如果你需要处理大量食材字符串,建议把正则模式预编译,这样可以提升效率:
import re

# 预编译正则模式
pattern = re.compile(r'\d+|cup|cups|tablespoon|tablespoons|teaspoon|teaspoons|softened|melted|, ')

def extract_ingredient(ing_str):
    return pattern.sub('', ing_str).strip()

# 批量处理
ingredients = ["2 cup butter, softened", "3 tablespoons sugar, granulated", "1 teaspoon vanilla extract"]
for ing in ingredients:
    print(extract_ingredient(ing))
  • 维护一个关键词列表,方便后续扩展,比如:
remove_words = ['cup', 'cups', 'tablespoon', 'tablespoons', 'teaspoon', 'teaspoons', 'softened', 'melted', 'granulated']
# 把列表转成正则的分支模式
pattern = re.compile(r'\d+|' + '|'.join(remove_words) + r'|, ')

内容的提问来源于stack exchange,提问作者Nikhil Raghavendra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:30