Мне нужно извлечь имена людей из следующего предложения.
Вход:СКАМЬЯ: МАХАДЖАН, МЕХР ЧАНД СКАМЬЯ: МАХАДЖАН, МЕХР ЧАНД ДАС, СУДХИ РАНДЖАН БОСЕ, ВИВИАН ХАСАН, ГУЛАМ ЦИТАТА: 1953 AIR 28 1953 SCR 197
Выход:МЕХР ЧАНД МАХАДЖАН, МЕХР ЧАНД МАХАДЖАН, СУДХИ РАНДЖАН ДАС, ВИВИАН БОСЕ, ГУЛАМ ХАСАН
Для извлечения имени из первой части предложения я использовал следующий код.
bench = re.search('BENCH: (.*?) BENCH', contents)
if bench:
bench = bench.group(1)
bench = ' '.join(reversed(bench.split(",")))
print(bench)
Выход:МЕХР ЧАНД МАХАДЖАН
Вы можете использовать это регулярное выражение для сопоставления имен во входных данных:
((?:\w+), (?:\w+(?: \w+)?))(?= BENCH:| CITATION:| \w+,)
Это ищет слово (\w+
), за которым следует запятая, а затем одно или два слова, разделенные пробелом (\w+(?: \w+)?
), а затем использует прямой просмотр, чтобы утверждать, что за этими словами должно следовать одно из BENCH:
, CITATION:
или другое слово. после запятой (\w+,
).
names = re.findall(r'((?:\w+), (?:\w+(?: \w+)?))(?= BENCH:| CITATION:| \w+,)', contents)
Для ваших выборочных данных это дает:
['MAHAJAN, MEHR CHAND', 'MAHAJAN, MEHR CHAND', 'DAS, SUDHI RANJAN', 'BOSE, VIVIAN', 'HASAN, GHULAM']
Затем этот список можно переформатировать по своему усмотрению:
names = ', '.join((map(lambda n:' '.join(n.split(', ')[-1::-1]), names)))
Выход:
'MEHR CHAND MAHAJAN, MEHR CHAND MAHAJAN, SUDHI RANJAN DAS, VIVIAN BOSE, GHULAM HASAN'