Регулярное выражение для поиска имени в предложении

У меня есть предложение вроде

1:

"RLB shows Oubre Jr. (WAS) legally ties up Nurkic (POR), and a held ball is correctly called."

2:

"Nurkic (POR) maintains legal guarding position and makes incidental contact with Wall (WAS) that does not affect his driving shot attempt."

Мне нужно использовать регулярное выражение Python, чтобы найти имя "Oubre Jr." , «Нуркич» и «Нуркич», «Стена».

p = r'\s*(\w+?)\s[(]' 

используйте этот шаблон, Я могу найти "['Nurkic', 'Wall']", но в предложении 1 я просто могу найти ['Nurkic'], пропущенный "Oubre Jr."

Кто может мне помочь?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 138
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот один из подходов:

line = "RLB shows Oubre Jr (WAS) legally ties up Nurkic (POR), and a held ball is correctly called."
results = re.findall( r'([A-Z][\w+'](?: [JS][r][.]?)?)(?= \([A-Z]+\))', line, re.M|re.I)
print(results)

['Oubre Jr', 'Nurkic']

Вышеупомянутая логика будет пытаться сопоставить одно имя, начинающееся с заглавной буквы, за которым, возможно, следует суффикс Jr. или Sr., за которым, в свою очередь, следует термин ([A-Z]+).

кажется, что раскраска кода не справляется с inline 'так хорошо: / nice solution

Patrick Artner 09.11.2018 08:10

Спасибо за быстрый ответ, но как предложения. 3: «Обре-младший (WAS) контактирует с головой Амину (POR) во время отскока». 4: «RAR показывает, что Амину (POR) обвивает Портера-младшего (WAS) вокруг талии и смещает его, влияя на его способность захватывать отскок». 5: «МакКоллум (ПОР) на мгновение держит руку Била (БЫЛ), но не влияет на его FOM вне мяча». По-прежнему будет скучать по «Обре-младшему», «Портеру-младшему» и «Билу». Не могли бы вы помочь?

whichen 09.11.2018 08:18

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

tripleee 09.11.2018 08:21

@tripleee Вы предлагаете, чтобы нет вежливо создавал ужасающий след комментариев, которые на самом деле не добавляют никакой ценности исходному вопросу? :-П

Tim Biegeleisen 09.11.2018 08:25

Если вы действительно хотите обсудить это дальше, возможно, разместите вопрос на Переполнение мета-стека

tripleee 09.11.2018 08:30

Вам нужен шаблон, который вы можете сопоставить - для своего предложения вы можете попытаться сопоставить вещи до (XXX) и включить список возможных «суффиксов», которые также можно включить - вам нужно будет извлечь их из своих источников.

import re

suffs = ["Jr."] # append more to list

rsu   = r"(?:"+"|".join(suffs)+")? ?"

# combine with suffixes
regex = r"(\w+ "+rsu+")\(\w{3}\)"

test_str = "RLB shows Oubre Jr. (WAS) legally ties up Nurkic (POR), and a held ball is correctly called. Nurkic (POR) maintains legal guarding position and makes incidental contact with Wall (WAS) that does not affect his driving shot attempt."

matches = re.finditer(regex, test_str, re.MULTILINE)

names = []
for matchNum, match in enumerate(matches,1):
    for groupNum in range(0, len(match.groups())):
        names.extend(match.groups(groupNum))

print(names)  

Выход:

['Oubre Jr.', 'Nurkic ', 'Nurkic ', 'Wall ']

Это должно работать до тех пор, пока у вас нет имен, в которых нет \w. Если вам нужно адаптировать регулярное выражение, используйте https://regex101.com/r/pRr9ZU/1 в качестве отправной точки.


Объяснение:

  • r"(?:"+"|".join(suffs)+")? ?" -> все элементы в списке suffs объединяются через | (ИЛИ) как негруппированные (?: ...) и делаются необязательными, за которыми следует необязательный пробел.
  • r"(\w+ "+rsu+")\(\w{3}\)" -> регулярное выражение ищет любые символы слова, за которыми следует необязательная группа suffs, которую мы только что создали, за которой следует буквальный (, затем три символа слова, за которыми следует еще один буквальный )
Ответ принят как подходящий

Вы можете использовать следующее регулярное выражение:

(?:[A-Z][a-z][\s\.a-z]*)+(?=\s\()

|-----Main Pattern-----|


Подробности:
  • (?:) - создает группу без захвата
  • [A-Z] - захватывает 1 заглавную букву
  • [a-z] - захватывает 1 строчную букву
  • [\s\.a-z]* - захватывает пробелы (' '), точки ('.') или строчные буквы 0+ раз
  • (?=\s\() - фиксирует основной паттерн, если за ним следует только строка ' ('

str = '''RLB shows Oubre Jr. (WAS) legally ties up Nurkic (POR), and a held ball is correctly called. 

Nurkic (POR) maintains legal guarding position and makes incidental contact with Wall (WAS) that does not affect his driving shot attempt.'''

res = re.findall( r'(?:[A-Z][a-z][\s\.a-z]*)+(?=\s\()', str )

print(res)

Демо: https://repl.it/@RahulVerma8/OvalRequiredAdvance?language=python3

Матч: https://regex101.com/r/OsLTrY/1

Поскольку у меня будет фраза типа «МакКоллум (ПОР) на мгновение положил руку на руку Била (БЫЛ), но не повлиял на его FOM вне мяча». . Итак, сначала я использую «re.sub (r '\' s * ',' ', test_str)», затем re.findall (r' ([AZ] [az] [\ s \ .az] *) + (? = \ s () ', test_str) Большое спасибо.

whichen 09.11.2018 08:33

Другие вопросы по теме