Одним из решений является удаление фруктов названий, чтобы получить цвет:
def remove_fruit_name(description):
return re.sub(r"apple|grapes", "", description)
df['Colors'] = df['Names'].apply(remove_fruit_name)
Если у вас много строк, компиляция вашего регулярного выражения может быть быстрее:
fruit_pattern = re.compile(r"apple|grapes")
def remove_fruit_name(description):
return fruit_pattern.sub("", description)
Другое решение - использовать прогнозное утверждение , оно (возможно) немного быстрее, но код немного сложнее:
# That may be useful to have a set of fruits:
valid_fruit_names = {"apple", "grapes"}
any_fruit_pattern = '|'.join(valid_fruit_names)
fruit_pattern = re.compile(f"(\w*)\s*(?={any_fruit_pattern})")
def remove_fruit_name(description):
match = fruit_pattern.search(description)
if match:
return match.groups()[0]
return description
df['Colors'] = df['Names'].apply(remove_fruit_name)
Вот пример заглядывания из документации:
(?=...)
Соответствует, если ...
соответствует следующему, но не использует ни одной строки. Это называется прогнозным утверждением . Например, Isaac (?=Asimov)
будет соответствовать 'Isaac '
, только если за ним следует 'Asimov'
.
Наконец, если вы хотите провести различие между normal
и green
, вам понадобится словарь допустимых цветов. То же самое относится и к названиям фруктов, если на входе есть не фруктовые строки, такие как topaz
.