У меня есть предложение вроде
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."
Кто может мне помочь?






Вот один из подходов:
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]+).
Спасибо за быстрый ответ, но как предложения. 3: «Обре-младший (WAS) контактирует с головой Амину (POR) во время отскока». 4: «RAR показывает, что Амину (POR) обвивает Портера-младшего (WAS) вокруг талии и смещает его, влияя на его способность захватывать отскок». 5: «МакКоллум (ПОР) на мгновение держит руку Била (БЫЛ), но не влияет на его FOM вне мяча». По-прежнему будет скучать по «Обре-младшему», «Портеру-младшему» и «Билу». Не могли бы вы помочь?
Добавление дополнительных требований в комментарии к индивидуальному ответу. Просто примите ответ и задайте новый вопрос, если на этом этапе вы обнаружите, что вам нужно что-то еще, чем вы изначально просили.
@tripleee Вы предлагаете, чтобы нет вежливо создавал ужасающий след комментариев, которые на самом деле не добавляют никакой ценности исходному вопросу? :-П
Если вы действительно хотите обсудить это дальше, возможно, разместите вопрос на Переполнение мета-стека
Вам нужен шаблон, который вы можете сопоставить - для своего предложения вы можете попытаться сопоставить вещи до (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) Большое спасибо.
кажется, что раскраска кода не справляется с inline 'так хорошо: / nice solution