2015-06-10 14 views
5

Ho una stringa che ha più parentesi. Diciamo cheEspressione regolare per trovare le parentesi in una stringa

s="(a(vdwvndw){}]" 

Voglio estrarre tutte le parentesi come una stringa separata.

ho provato questo:

>>> brackets=re.search(r"[(){}[]]+",s) 
>>> brackets.group() 

ma è solo mi dà ultimi due staffe.

'}]' 

Perché è quello? Non dovrebbe recuperare una o più parentesi nel set di caratteri?

+2

vedere 're.findall' http://stackoverflow.com/questions/7724993/python-using-regex-to-find-multiple-matches -e-print-them-out – C8H10N4O2

+0

https://regex101.com/ è un ottimo strumento per creare e testare le espressioni regolari. – asimoneau

+0

Si noti che 're.search' produce solo la prima corrispondenza. – TigerhawkT3

risposta

7

È necessario sfuggire alla prima parentesi quadra di chiusura.

r'[(){}[\]]+' 

Per combinare tutti loro in una stringa, è possibile cercare qualsiasi cosa che non partita e rimuoverlo.

brackets = re.sub(r'[^(){}[\]]', '', s) 
3

Utilizza il seguente (Chiusura parentesi quadra deve essere sfuggito all'interno classe di caratteri):

brackets=re.search(r"[(){}[\]]+",s) 
          ↑ 
+0

Ciao Grazie per il tuo commento. Ma non sono in grado di capire perché devo scappare dall'ultima parentesi quadra. La classe del personaggio non dovrebbe cercare nessuno di quei personaggi e + ne farebbe uno o più? – user

+0

@user hai ragione ... ma come sarà regex sapere quale parentesi quadra è quella di chiusura? quello interno? o quello esterno? .. ecco perché devi scappare da quello interno .. spero tu abbia capito il mio punto .. –

+0

Sì.Ma perché la ricerca recupera solo una corrispondenza? Sto usando "+" quindi non dovrebbe prenderne uno o più? – user

1

L'espressione regolare "[(){}[]]+" (o meglio "[](){}[]+" o "[(){}[\]]+" (come altri hanno suggerito)) trova una sequenza di caratteri consecutivi. Quello che devi fare è trovare tutte queste sequenze e unirle a loro.

Una soluzione è questa:

brackets = ''.join(re.findall(r"[](){}[]+",s)) 

Si noti anche che ho riordinato l'ordine dei caratteri in una classe, come ] deve essere all'inizio di una classe in modo che non viene interpretato come la fine del definizione della classe.

+0

Cosa dire di' re.sub' con un '^', viz 'parentesi = ri .sub (r '[^]() {} []', '', s) '? – TigerhawkT3

+0

Questo è ancora meglio! –

+0

+1 per essere la prima risposta a produrre effettivamente l'output desiderato: P (e per evitare il backslash). – TigerhawkT3

1

Si potrebbe anche fare questo senza una regex:

s="(a(vdwvndw){}]" 
keep = {"(",")","[","]","{","}"} 
print("".join([ch for ch in s if ch in keep])) 
((){}] 
+0

Oppure, dal momento che mi sembra Python 3, 'print (* (ch per ch in s se ch in keep), sep = '')'. – TigerhawkT3

+0

@ TigerhawkT3, sì, vero ma presumo che l'OP voglia utilizzare la stringa in modo che venga assegnata a una variabile. –

+0

Buon punto. Non riesco a resistere a '*. – TigerhawkT3

Problemi correlati