2014-01-26 11 views
5

Der folgende Code gibt alle benannten Gruppen an, die in einem Muster verwendet werden.Muster, das einer benannten Gruppe zugeordnet ist

import re 

pattern = r"(?P<DEF_FUNC>def (?P<NAME_FUNC>\w+)\s*\((.*?)\):)|(?P<OTHERS>\w+)" 
regex = re.compile(pattern) 

for name in sorted(
    regex.groupindex, 
    key = regex.groupindex.get 
): 
    print(name) 

Hier ist der entsprechende Ausgang.

Ich möchte auch die entsprechenden Muster haben, um die folgende Ausgabe zu erhalten.

DEF_FUNC --> def (?P<NAME_FUNC>\w+)\s*\((.*?)\) 
NAME_FUNC --> \w+ 
OTHERS --> \w+ 

Gibt es eine schwierige Art und Weise, das zu tun, ohne es „auf der Hand“ über Regex sucht in dem Mustertext zu tun?

+0

tun Sie die Muster zusammen mit dem Ergebnis drucken? Ich denke, du musst deine Sachen kopieren ... das Problem ist, dass DEF_FUNC aus NAME_FUNC besteht und somit den Weg zum "Cheat" blockiert ... – zmo

+0

Hallo. Ich möchte jedes Muster kennen, das einer benannten Gruppe zugeordnet ist. In meiner Frage ist das Drucken nur dazu da, die Ergebnisse zu sehen und zu testen. –

+0

Ich würde gerne von jemandem korrigiert werden, aber ich bin mir ziemlich sicher, dass Sie eine Funktion schreiben müssen, um dies zu tun: Ich sehe keine eingebaute Funktionalität, die das erreicht, was Sie wollen. –

Antwort

1

Sie können sre_parse überprüfen:

import re, sre_parse 
pattern = r"(?P<DEF_FUNC>def (?P<NAME_FUNC>\w+)\s*\((.*?)\):)|(?P<OTHERS>\w+)" 
v = sre_parse.parse(pattern) 
print v.pattern.groupdict # sub-pattern id of each group 
#print v.dump() 
print v.data # find the subgroups and match the ids 
+0

Das sieht sehr interessant aus! Dies scheint alle Informationen zu geben. Ich werde damit spielen. –

+1

Das ist großartig das 'v.dump()'. Das wird wirklich helfen. Vielen Dank, dass Sie darauf hingewiesen haben. –

Verwandte Themen