#python #regex #pandas
Вопрос:
Я пытаюсь определить, есть ли в ячейке слово «Макдональдс». Однако я хотел бы проигнорировать случай, когда в слове перед «Макдональдом» есть первая заглавная буква, например «Кевин Макдональд». Есть какие-нибудь предложения, как сделать это правильно с помощью регулярного выражения в фрейме данных pandas?
data = {'text':["Kevin McDonald has bought a burger.",
"The best burger in McDonald is cheeze buger."]}
df = pd.DataFrame(data)
long_list = ['McDonald', 'Five Guys']
# matching any of the words
pattern = r'b{}b'.format('|'.join(long_list))
df['count'] = df.text.str.count(pattern)
text
0 Kevin McDonald has bought a burger.
1 The best burger in McDonald is cheeze buger.
Ожидаемый результат:
text count
0 Kevin McDonald has bought a burger. 0
1 The best burger in McDonald is cheeze buger. 1
Комментарии:
1. Вы можете найти регулярное выражение для этого конкретного шаблона, но если вы пытаетесь отличить имена людей от других имен собственных, используйте что-то более подходящее: поработайте со списком слов/токенов или, еще лучше, загрузите распознаватель именованных сущностей (NER)
2. Вы имеете в виду применение NER для удаления клеток типа «Кевин Макдональд»? Хмм. Это довольно интересная идея. @алексис
3. Более или менее. Вы не объясняете причину, по которой пытаетесь провести это различие, но какова бы ни была ваша цель, в ближайшем будущем вам, вероятно, понадобится больше правил, и для этого существуют лучшие подходы, чем регулярные выражения из целого предложения…
Ответ №1:
Вы можете попробовать этот шаблон:
pattern = r'b[a-z].*?b {}'.format('|'.join(long_list))
df['count'] = df.text.str.count(pattern)
Ответ №2:
IIUC, цель состоит в том, чтобы не совпадать, когда есть предыдущее слово, написанное с заглавной буквы. Проверка того, что раньше было слово без заглавной буквы, устранила бы многие законные возможности.
Вот регулярное выражение, которое работает еще для нескольких возможностей (начало предложения, без слов до):
regex = '|'.join(fr'(?:b[^A-Z]S*s |[^ws] ?|^){i}' for i in long_list)
df['count'] = df['text'].str.count(regex)
пример:
text count
0 Kevin McDonald has bought a burger. 0
1 The best burger in McDonald is cheeze buger. 1
2 McDonald's restaurants. 1
3 Blah. McDonald's restaurants. 1
Вы можете проверить и понять регулярное выражение здесь
Комментарии:
1. Вау, я думаю, что ты хранитель строки Python!