Python 3中高效移除字符串指定词汇的方法咨询
看起来你现在需要从食材字符串里提取核心的食材名称,比如从"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

