Условно извлекая начало шаблона регулярного выражения - PullRequest
0 голосов
/ 29 января 2020

У меня есть список строк, содержащих имена актеров в mov ie, которые я хочу извлечь. В некоторых случаях также указывается имя персонажа актера, которое следует игнорировать. Вот несколько примеров:

# example 1
input = 'Levan Gelbakhiani as Merab\nAna Javakishvili as Mary\nAnano Makharadze'
expected_output = ['Levan Gelbakhiani', 'Ana Javakishvili', 'Anano Makharadze']

# example 2
input = 'Yoosuf Shafeeu\nAhmed Saeed\nMohamed Manik'
expected_output = ['Yoosuf Shafeeu', 'Ahmed Saeed', 'Mohamed Manik']

Вот что я пытался безрезультатно:

import re
output = re.findall(r'(?:\\n)?([\w ]+)(?= as )?', input)
output = re.findall(r'(?:\\n)?([\w ]+)(?: as )?', input)
output = re.findall(r'(?:\\n)?([\w ]+)(?:(?= as )|(?! as ))', input)

Ответы [ 3 ]

0 голосов
/ 29 января 2020

\n во входной строке - символы новой строки. Мы можем использовать этот факт в нашем регулярном выражении.

По сути, каждая строка всегда начинается с имени актера. После имени актера может быть слово as или конец строки.

Используя эту информацию, мы можем написать регулярное выражение следующим образом:

^(?:[\w ]+?)(?:(?= as )|$)

Сначала мы утверждаем, что мы должны быть в начале строки ^. Затем мы сопоставляем некоторые символы слова и пробелы лениво [\w ]+?, пока не увидим (?:(?= as )|$), либо as, либо конец строки.

В коде

output = re.findall(r'^(?:[\w ]+?)(?:(?= as )|$)', input, re.MULTILINE)

Не забудьте использовать параметр мультилинии. Именно поэтому ^ и $ означают «начало / конец строки ».

0 голосов
/ 29 января 2020

Полагаю, вы можете объединить значения, полученные из двух совпадений регулярных выражений:

re.findall('(?:\\n)?(.+)(?:\W[a][s].*?)|(?:\\n)?(.+)$', input)

дает

[('Levan Gelbakhiani', ''), ('Ana Javakishvili', ''), ('', 'Anano Makharadze')]

, из которого вы фильтруете пустые строки

output = list(map(lambda x : list(filter(len, x))[0], output))

т

['Levan Gelbakhiani', 'Ana Javakishvili', 'Anano Makharadze']
0 голосов
/ 29 января 2020

Вы можете сделать это без использования регулярных выражений. Вот код:

output = [x.split(' as')[0] for x in input.split('\n')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...