Regex, чтобы захватить слово перед определенным символом в Python - PullRequest
0 голосов
/ 21 марта 2019

Я хочу извлечь слово перед определенным символом из столбца имен и добавить новый столбец как цвет

, если перед именем нет цвета, тогда я хочу отобразить пустую строку

Iпытался извлечь слово до матча.Например, у меня есть следующая таблица:

import pandas as pd
import re
data = ['red apple','green topaz','black grapes','white grapes']
df = pd.DataFrame(data, columns = ['Names']) 

     Names
red apple
green apple
black grapes
white grapes
normal apples
red apple

Код ниже, я был treid Я ожидаю Частичное получение вывода

df['Names'].apply(lambda x: ' '.join(re.findall(r'(\w+)\s+apple', x)))

df['Names'].apply(lambda x: ' '.join(re.findall(r'(\w+)\s+apple|grapes', x)))

Желаемый вывод:

Names           color
red apple       red
green apple     green
black grapes    black
white grapes    white
normal apples
red apple       red  

Пожалуйста, помогите мне с этим вопросом

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Я нашел это решение: дает мне color_column вроде ['red', 'green', 'black', 'white', '']

import re
data = ['red apple','green topaz','black grapes','white grapes','apples']

colors_column = list(map(lambda x: ' '.join(re.findall(r'(\S\w+)\s+\w+', x)) ,data))
1 голос
/ 21 марта 2019

Одним из решений является удаление фруктов названий, чтобы получить цвет:

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.

1 голос
/ 21 марта 2019

Не обязательно элегантный трюк, но, похоже, это работает:

((re.search('(\w*) (apple|grape)',a)) or ['',''])[1]

Вкратце, вы ищете первое слово перед яблоком или виноградом, но если совпадения нет, возвращается None, чтоложноТаким образом, вы используете или со списком пустых строк, но так как вы хотите взять первый элемент сопоставленного выражения (индекс 1), я использовал двухэлементный список пустых строк (чтобы взять второй элемент там).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...