2014-05-08 12 views
5

Voglio una regex python per catturare sia una staffa o una stringa vuota. Provare il solito approccio non funziona. Ho bisogno di scappare da qualche parte ma ho provato tutto quello che so.Come faccio a corrispondere a zero o più staffe in pitone regex

one = "this is the first string [with brackets]" 
two = "this is the second string without brackets" 

# This captures the bracket on the first but throws 
# an exception on the second because no group(1) was captured 
re.search('(\[)', one).group(1) 
re.search('(\[)', two).group(1) 

# Adding a "?" for match zero or one occurrence ends up capturing an 
# empty string on both 
re.search('(\[?)', one).group(1) 
re.search('(\[?)', two).group(1) 

# Also tried this but same behavior 
re.search('([[])', one).group(1) 
re.search('([[])', two).group(1) 

# This one replicates the first solution's behavior 
re.search("(\[+?)", one).group(1) # captures the bracket 
re.search("(\[+?)", two).group(1) # throws exception 

è l'unica soluzione per me, per controllare che la ricerca ha restituito Nessuno?

+1

I' D dì che non hai bisogno del gruppo che cattura. Basta vedere se '\ [' corrisponde o meno. Quale dovrebbe essere lo scopo del gruppo di cattura comunque se l'unica cosa che può eguagliare è una singola [. – donfuxx

+0

Non sei sicuro di quale sia il problema. Vuoi abbinare una parentesi o una stringa vuota. Il secondo input contiene una stringa vuota tra ogni carattere, quindi corrisponde alla stringa vuota. – Barmar

+0

In, elementi opzionali generali in un'espressione regolare hanno senso solo se sono prima o dopo qualche altra cosa che si desidera abbinare. Cercarlo da solo non ha senso - se è opzionale, l'input corrisponderà se lo contiene o no. – Barmar

risposta

2

Ecco un approccio diverso.

import re 

def ismatch(match): 
    return '' if match is None else match.group() 

one = 'this is the first string [with brackets]' 
two = 'this is the second string without brackets' 

ismatch(re.search('\[', one)) # Returns the bracket '[' 
ismatch(re.search('\[', two)) # Returns empty string '' 
6

La risposta è semplice! :

(\[+|$) 

Perché l'unica stringa vuota è necessario acquisire è l'ultimo della stringa.

0

In definitiva, la cosa che volevo fare è quello di prendere una stringa e, se trovo qualche parentesi quadre o graffe, rimuovere le staffe e il loro contenuto dalla stringa. Stavo cercando di isolare le stringhe che aveva bisogno di fissaggio prima trovando una corrispondenza e la fissazione dell'elenco risultante in una seconda fase, quando tutto quello che dovevo fare era fare entrambe le cose allo stesso tempo come segue:

re.sub ("\[.*\]|\{.*\}", "", one) 
Problemi correlati