2009-02-17 5 views
3

Comment puis-je faire correspondre une ou plusieurs expressions entre parenthèses apparaissant à la fin d'une chaîne?Faire correspondre une série de parenthèses équilibrées (non imbriquées) à la fin de la chaîne

Entrée:

'hello (i) (m:foo)' 

sortie souhaitée:

['i', 'm:foo'] 

Destiné à un script python. Les marques de parenté ne peuvent pas apparaître l'une dans l'autre (no nesting) et les expressions entre parenthèses peuvent être séparées par des espaces.

Il est plus difficile que cela puisse paraître à première vue, du moins il me semble.

Répondre

7
paren_pattern = re.compile(r"\(([^()]*)\)(?=(?:\s*\([^()]*\))*\s*$)") 

def getParens(s): 
    return paren_pattern.findall(s) 

ou encore plus court:

getParens = re.compile(r"\(([^()]*)\)(?=(?:\s*\([^()]*\))*\s*$)").findall 

explaination:

\(     # opening paren 
([^()]*)    # content, captured into group 1 
\)      # closing paren 
(?=     # look ahead for... 
    (?:\s*\([^()]*\))* # a series of parens, separated by whitespace 
    \s*     # possibly more whitespace after 
    $     # end of string 
)      # end of look ahead 
5

Vous ne besoin d'utiliser regex:

def splitter(input): 
    return [ s.rstrip(" \t)") for s in input.split("(") ][1:] 
print splitter('hello (i) (m:foo)') 

Note: cette solution ne fonctionne que si votre entrée est déjà connue pour être valide. Voir la solution de MizardX qui fonctionnera sur n'importe quelle entrée.

+0

La spécification est que nous Reconnait uniquement les expressions à la fin parenthétiques de la chaîne. L'implémentation donnée ne fonctionne pas si nous avons des expressions entre parenthèses qui * ne sont pas * à la fin de la chaîne que nous voulons éviter d'apparier. –

+0

certainement intelligent. vous pouvez faire 'pour s dans input.split (" (") si s' plutôt que le [1:] –

Questions connexes