2016-10-04 3 views
0

Ich habe diesen Text BeispielWiederholte regex Gruppen beliebiger Anzahl

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

und ich möchte die Worte in ‚‘ extrahieren, aber mit dem Kontext (Status, Haupt, Popup) sortiert.

Mein aktueller regex ist (example at pythex.org):

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

aber mit diesem ich nur 'Maintext2' bekommen und nicht beide. Ich weiß nicht, wie ich die Gruppen zu einer beliebigen Zahl wiederhole.

+0

zu gruppieren zufällige Zeichenfolge nicht der richtige Weg ist. Es sollte generisch und nicht hartcodiert sein. –

Antwort

1

Sie können mit diesem versuchen:

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

Look here Gruppe1 und Gruppe 2 für jedes Spiel enthalten Ihr Schlüsselwertpaar

Sie können nicht das zweite Spiel als eine Einheit verschmelzen durch regex, wenn Sie Holen Sie sich alle Paare ... Sie können hier einige Programmierungen anwenden, um doppelte Schlüssel als eins zusammenzuführen.

Hier habe ich Wörterbuch der Liste verwendet, wenn ein Schlüssel bereits im Wörterbuch vorhanden ist, dann sollten Sie den Wert an die Liste anhängen, andernfalls fügen Sie einen neuen Schlüssel mit einer neuen Liste mit dem Wert ein.

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) 

Ausgang:

{ 
'Popup[apphmi]': ['Popuptext1'], 
'Main[apphmi]': ['Maintext1', 'Maintext2'], 
'Status[apphmi]': ['Statustext1'] 
}