Отрицательное предположение нулевой ширины: (?!pattern)
.
Это упомянуто на полпути вниз по странице документации re модуля .
(?!...)
Соответствует, если ... не соответствует следующему.Это негативное предположение.Например, Исаак (?! Азимов) будет соответствовать «Исааку», только если за ним не следует «Азимов».
Таким образом, вы можете использовать его для сопоставления любого количества слов после клавиши, но неключ, использующий что-то вроде (?!\S+:)\S+
.
И полный код будет выглядеть так:
regex = re.compile(r'''
[\S]+: # a key (any word followed by a colon)
(?:
\s # then a space in between
(?!\S+:)\S+ # then a value (any word not followed by a colon)
)+ # match multiple values if present
''', re.VERBOSE)
matches = regex.findall(my_str)
Что дает
['key1: val1-words ', 'key2: val2-words ', 'key3: val3-words']
Если вы напечатаете ключ /значения, используя:
for match in matches:
print match
Будет напечатано:
key1: val1-words
key2: val2-words
key3: val3-words
Или, используя ваш обновленный пример, будет напечатано:
Thème: O sombres héros
Contraintes: sous titrés
Author: nicoalabdou
Tags: wakatanka productions court métrage kino session humour cantat bertrand noir désir sombres héros mer medine marie trintignant femme droit des femmes nicoalabdou pute soumise
Posted: 06 June 2009
Rating: 1.3
Votes: 3
Вы можете повернуть каждую клавишу /пара значений в словарь, используя что-то вроде этого:
pairs = dict([match.split(':', 1) for match in matches])
, что облегчит поиск только тех ключей (и значений), которые вы хотите.
Дополнительная информация: