2013-03-08 20 views
9

Ho il seguente regolare sostituzione di espressione:utilizzare espressioni regolari per sostituire sottopattern sovrapposte

input=re.sub(r"([a-zA-Z0-9])\s+([a-zA-Z0-9])" , r"\1*\2" , input) 

Io uso l'espressione regolare sulla stringa "3 a 5 b".

Torno "3*a 5*b".

Sto pensando che dovrei tornare "3*a*5*b".

Quindi in qualche modo le mie sostituzioni di espressioni regolari interferiscono l'una con l'altra.

Cosa posso fare per ottenere il risultato desiderato, a parte le esecuzioni iterative dell'espressione regolare?

+0

input = re.sub ("", "*", input) - questo ti fa diventare quello che vuoi – PurityLake

+1

No, @PurityLake, non è così. Ciò produrrebbe rimpiazzi errati nella stringa '" 3/a 5! B "' – Richard

+0

scusa ho agito solo sull'informazione che mi è stata data, ho solo pensato che volevi sostituire gli spazi con il carattere "*" – PurityLake

risposta

18

Utilizzare un lookahead assertion, (?=...), in modo da non mangiare il secondo modello:

In [33]: re.sub(r"([a-zA-Z0-9])\s+(?=[a-zA-Z0-9])" , r"\1*" , '3 a 5 b') 
Out[33]: '3*a*5*b' 

In [32]: re.sub(r"([a-zA-Z0-9])\s+(?=[a-zA-Z0-9])" , r"\1*" , "3 /a 5! b") 
Out[32]: '3 /a*5! b' 
+0

@StevenRumbalski: Grazie! – unutbu

+0

E ** ricorda **, quando si modifica un (gruppo) in un (? = Lookahead), il (gruppo) non esiste più. Ecco perché non c'è nessun \ 2 in questa risposta. –

1

Le espressioni regolari non sono sempre lo strumento migliore per il lavoro quando si utilizza Python. Per il caso di descrivere sopra, Python offre una, più leggibile e più gestibile metodo molto più semplice:

>>> s = "3 a 5 b" 
>>> '*'.join(s.split()) 
'3*a*5*b' 
+0

Una bella risposta - sfortunatamente, l'O.P. ha aggiornato i suoi bisogni nei commenti. Questo però risponde alla domanda originale. – jsbueno

+0

La classe di carattere '[a-zA-Z0-9]' esclude chiaramente la sostituzione dello spazio quando cade tra una varietà di caratteri mentre la risposta suggerita non lo fa. – Richard

+0

Ah si, il post è stato aggiornato vedo. Date le nuove informazioni, un'asserzione lookahead sembra davvero la migliore risposta a me. –

Problemi correlati