2016-10-04 3 views
0

У меня есть этот пример фрагмент текстПовторных регулярные выражения группы произвольного числа

headline: 
     Status[apphmi]: blubb, 'Statustext1' 
     Main[apphmi]: bla, 'Maintext1'Main[apphmi]: blaa, 'Maintext2' 
     Popup[apphmi]: blaaa, 'Popuptext1' 

, и я хочу, чтобы извлечь слова в «», но сортируются с контекстом (статус, основные, всплывающим).

Мое текущее регулярное выражение (example at pythex.org):

headline:(?:\n +Status\[apphmi\]:.* '(.*)')*(?:\n +Main\[apphmi\]:.* '(.*)')*(?:\n +Popup\[apphmi\]:.* '(.*)')* 

, но с этим я только получаю 'Maintext2', а не оба. Я не знаю, как повторять группы до произвольного числа.

+0

Это не правильный путь к группе случайной строки. Он должен быть общим, а не жестко запрограммированным. –

ответ

1

Вы можете попробовать это:

r"(.*?]):(?:[^']*)'([^']*)'"g 

Look here Group1 и группы 2 для каждого матча содержит пары ключей значение

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

Здесь я использовал словарь списка, если ключ уже существует в словаре, тогда вы должны добавить это значение в список, иначе вставьте новый ключ с новым списком, имеющим значение.

This is how it should be done (tested in python 3+)

import re 

d = dict() 
regex = r"(.*?]):(?:[^']*)'([^']*)'" 

test_str = ("headline:  \n" 
    "Status[apphmi]: blubb, 'Statustext1'\n" 
    "Main[apphmi]: bla, 'Maintext1'Main[apphmi]: blaa, 'Maintext2'\n" 
    "Popup[apphmi]: blaaa, 'Popuptext1'") 

matches = re.finditer(regex, test_str) 

for matchNum, match in enumerate(matches): 
    if match.group(1) in d: 
     d[match.group(1)].append(match.group(2)) 
    else: 
     d[match.group(1)] = [match.group(2),] 
print(d) 

Выход:

{ 
'Popup[apphmi]': ['Popuptext1'], 
'Main[apphmi]': ['Maintext1', 'Maintext2'], 
'Status[apphmi]': ['Statustext1'] 
} 
Смежные вопросы