2015-07-16 3 views
2

Мне нужна ваша помощь, потому что вы хотите использовать регулярное выражение в списке, чтобы получить только строку после моего ключевого слова.Как использовать регулярное выражение в списке Python

my_list выглядит следующим образом:

['Paris, 458 boulevard Saint-Germain', 'Marseille, 29 rue Camille Desmoulins', 'Marseille, 1 chemin des Aubagnens'] 

Регулярное выражение:

re.compile(ur'(?<=rue|boulevard|quai|chemin).*', re.MULTILINE) 

Ожидаемый список после обработки:

['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens'] 

Спасибо вам за помощь.

ответ

2

Кажется, ваше регулярное выражение не работает в Python, ошибка, которую он выбрасывает, - look-behind requires fixed-width pattern.

Кроме того, обратите внимание, что re.MULTILINE флаг вам в регулярном выражении является излишней, поскольку нет ни ^$ заново определить поведение для в шаблоне.

Вот код, который вы можете использовать:

import re 
lst = ['Paris, 458 boulevard Saint-Germain', 'Marseille, 29 rue Camille Desmoulins', 'Marseille, 1 chemin des Aubagnens'] 
p = re.compile(r'.*(?:rue|boulevard|quai|chemin)') 
print [p.sub('', x).strip() for x in lst] 

IDEONE demo

Результат:

['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens'] 

r'.*(?:rue|boulevard|quai|chemin)' регулярное выражение соответствует

  • .* - 0 и более любых символов
  • (?:rue|boulevard|quai|chemin) - 1 из альтернатив, разделенных |.

, а затем соответствующий текст удаляется re.sub.

Примечание вы можете заставить все согласование слов с \b границы словом, так что chemin был подобран и не chemins:

r'.*\b(?:rue|boulevard|quai|chemin)\b' 
1

Утверждению назад должно иметь постоянную ширину в питоне регулярных выражений.
Попробуйте это простое регулярное выражение вместо -

>>> regex = re.compile(ur'(?:rue|boulevard|quai|chemin)(.*)', re.MULTILINE) 
>>> [re.findall(regex, e)[0].strip() for e in my_list] 
['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens'] 

EDIT:
Использование различных просмотра назад может работать -

(?:(?<=rue)|(?<=boulevard)|(?<=quai)|(?<=chemin))(.*) 

Пример -

>>> regex = re.compile(ur'(?:(?<=rue)|(?<=boulevard)|(?<=quai)|(?<=chemin))(.*)', re.MULTILINE) 
>>> [re.findall(regex, e)[0].strip() for e in li] 
['Saint-Germain', 'Camille Desmoulins', 'des Aubagnens'] 
Смежные вопросы