Подсчитайте слово, но игнорируйте, если в нем есть слово с заглавной буквы перед

#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!