2013-08-12 7 views
5

Non riesco a capire come farlo funzionare con il comando di sostituzione, che è quello che mi è stato detto di fare. Sto usando questo testo come una variabile:utilizzando il comando di sostituzione di espressioni regolari per inserire gli zeri iniziali di fronte a numeri inferiori a 10 in una stringa di nomi di file

text = 'file1, file2, file10, file20' 

voglio cercare il testo e sostituto in uno zero di fronte a qualsiasi numero inferiore a 10. Pensavo di poter fare e istruzione if a seconda o meno ri .match o findall troverebbero solo una cifra dopo il testo, ma non riesco a eseguirlo. Ecco il mio codice di partenza dove sto cercando di estrarre la stringa e le cifre in gruppi, ed estrarre solo le quei nomi di file con una sola cifra:

import re 
text = 'file1, file2, file10, file20' 
mtch = re.findall('^([a-z]+)(\d{1})$',text) 

ma non funziona

risposta

1

È possibile utilizzare:

re.sub('[a-zA-Z]\d,', lambda x: x.group(0)[0] + '0' + x.group(0)[1:], s) 
+0

funziona alla grande ma non seguo totalmente quello che sta facendo – kflaw

+0

il pattern di ricerca che ho usato ''[a-zA-Z] \ d,'' restituisce una stringa di * len() = 3 *, e il 're. Il metodo sub() 'ti permette di usare questa stringa chiamando una funzione come secondo argomento, il che rende piuttosto facile costruire sostituzioni complesse usando i valori della stringa corrispondente. Dovresti [fare riferimento qui] (http://docs.python.org/2/library/re.html) per ulteriori dettagli ed esempi ... –

+0

questa parte non sono completamente chiaro su: x.group (0) [0] + '0' + x.group (0) [1:] – kflaw

1

Ancore ancoraggio l'inizio e la fine di stringhe (o linee, in modalità multi-linea). Quello che stai cercando sono i limiti di parola . E, naturalmente, non è necessario il quantificatore {1}.

\b([a-z]+)(\d)\b 

(Non sono sicuro di come si prevede di utilizzare la cattura, quindi lascio quelli da soli.)

+0

quando ho provato questo e ho provato a stampare mtch, mi ha dato una lista vuota: – kflaw

1

È possibile utilizzare re.sub con str.zfill:

>>> text = 'file1, file2, file10, file20' 
>>> re.sub(r'(\d+)', lambda m : m.group(1).zfill(2), text) 
'file01, file02, file10, file20' 
#or 
>>> re.sub(r'([a-z]+)(\d+)', lambda m : m.group(1)+m.group(2).zfill(2), text) 
'file01, file02, file10, file20' 
+0

grazie! ma cosa ho altri nomi di file nella mia stringa, come file100? voglio solo uno zero iniziale – kflaw

+0

@kflaw Funziona bene per 'file100', qual è il problema? –

0

Hai applicato l'ancoraggio iniziale e finale, quindi il modello canno essere pienamente abbinati

provare qualcosa di simile

text = "file1, file2, file3, file4, file10, file20, file100" 
print re.sub("(?<=[a-z])\d(?!\d),?", "0\g<0>", text) 

si tradurrà in

file01, file02, file03, file04, file10, file20, file100 

Questo dovrebbe funzionare se si dispone di una lista come sopra o un singolo nome di un elemento.

Spiegazione

(?<=[a-z]) - Verifica che i personaggi precedenti sono le lettere utilizzando sguardo dietro

\d - partite una sola cifra

(?!\d) - Verifica che non ci sono più cifre utilizzando lookahead

,? - consente una virgola opzionale nell'elenco

0\g<0> - Il modello corrisponde a una singola cifra, quindi è banale aggiungere uno zero. Il numero \g<0> corrisponde al gruppo.

Problemi correlati