2016-05-06 8 views
1

Lassen Sie uns sagen, dass ich eine Zeichenfolge wie diese haben ...Python re Rückreferenzierung Elemente wiederholt

myStr = 'START1(stuff); II(morestuff); 8(lessstuff)' 

... und ich möchte die Zeichenfolge unmittelbar vor den Klammern extrahieren, sowie die Zeichenfolge innerhalb der Klammern: 1, stuff, II, morestuff, 8, lessstuff. Ich kann dies unter Verwendung split(';'), etc. erreichen, aber ich möchte sehen, ob ich es auf einen Schlag mit re.search() tun kann. Ich habe versucht, ...

test = re.search(r'START(?:([I0-9]+)\(([^)]+?)\)(?:;)?)*', myStr).groups() 

... oder in einem besser lesbaren Format ...

test = re.search(r''' 
        START   # This part begins each string 
        (?:   # non-capturing group 
        ([I0-9]+) # capture label before parentheses 
        \(
         ([^)]+?) # any characters between the parentheses 
        \) 
        (?:;)?  # semicolon + space delimiter 
       )* 
        ''', myStr, re.VERBOSE).groups() 

... aber ich bekomme nur den letzten Hit: ('8', 'lessstuff'). Gibt es eine Möglichkeit, mehrere Treffer des gleichen Teils des Ausdrucks zurückzuverweisen?

+0

Sie wollen 'START1' oder '1'? – heemayl

+1

Wenn Sie das tun, müssen Sie unbedingt zuerst die "re.VERBOSE" -Flag erfahren: https://docs.python.org/2/library/re.html#re.VERBOSE ;-) – thebjorn

+0

@heemayl Nur '1'. Ich hätte "START" für diese Frage abstellen können. – reynoldsnlp

Antwort

3

können Sie diese Regex in findall verwenden Ihren Text zu erfassen:

>>> myStr = 'START1(stuff); II(morestuff); 8(lessstuff)' 
>>> print re.findall(r'(?:START)?(\w+)\(([^)]*)\)', myStr) 
[('1', 'stuff'), ('II', 'morestuff'), ('8', 'lessstuff')] 

RegEx Demo

+1

Danke! Ich hatte 'findall() 'vergessen! – reynoldsnlp