Elimina cifre in Python (Regex)
Domanda
Sto cercando di eliminare tutte le cifre da una stringa. Tuttavia, il codice successivo cancella anche le cifre contenute in qualsiasi parola e ovviamente non lo voglio. Ho provato molte espressioni regolari senza successo.
Grazie!
s = "This must not b3 delet3d, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s
Risultato:
Questo non deve essere eliminato, ma il numero alla fine sì
Soluzione
Aggiungi uno spazio prima di \ d +.
>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '
Modifica: dopo aver visto i commenti, ho deciso di formare una risposta più completa. Penso che ciò rappresenti tutti i casi.
s = re.sub("^\d+\s|\s\d+\s|\s\d+<*>quot;, " ", s)
Altri suggerimenti
Prova questo:
"\b\d+\b"
Che corrisponderà solo a quelle cifre che non fanno parte di un'altra parola.
L'uso di \ s
non è molto buono, dal momento che non gestisce le schede, et al. Un primo taglio per una soluzione migliore è:
re.sub(r"\b\d+\b", "", s)
Nota che il pattern è una stringa non elaborata perché \ b
è normalmente la escape backspace per le stringhe, e noi preferiamo invece la escape speciale regex del limite di parole. Una versione leggermente più elaborata è:
re.sub(r"$\d+\W+|\b\d+\b|\W+\d+<*>quot;, "", s)
Che tenta di rimuovere gli spazi iniziali / finali quando ci sono cifre all'inizio / alla fine della stringa. Dico " prova " perché se ci sono più numeri alla fine, hai ancora degli spazi.
Per gestire anche le stringhe di cifre all'inizio di una riga:
s = re.sub(r"(^|\W)\d+", "", s)
Se il tuo numero è sempre alla fine delle stringhe prova: re.sub (" \ d + $ " ;, " " ;, s)
altrimenti, puoi provare re.sub (" (\ s) \ d + (\ s) " ;, " \ 1 \ 2 " ;, s)
Puoi regolare i riferimenti posteriori per mantenere solo uno o due spazi (\ s corrispondono a qualsiasi separatore bianco)
Soluzione non regex:
>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'
Divide per " "
e verifica se il blocco è un numero facendo < code> str (). isdigit () , quindi li unisce di nuovo insieme. Più verbalmente (non usando una comprensione dell'elenco):
words = s.split(" ")
non_digits = []
for word in words:
if not word.isdigit():
non_digits.append(word)
" ".join(non_digits)
Non so quale sia la tua situazione reale, ma la maggior parte delle risposte sembra che non gestiranno numeri o decimali negativi,
re.sub (R " (\ b | \ s + \ - | ^ \ -) ??(\ d + | \ d * \ \ d +) \ b "??., & Quot; ")
Quanto sopra dovrebbe anche gestire cose come,
" Questo non deve b3 delet3d, ma il numero alla fine si -134.411 "
Ma questo è ancora incompleto: probabilmente avrai bisogno di una definizione più completa di ciò che puoi aspettarti di trovare nei file che devi analizzare.
Modifica: vale anche la pena notare che '\ b' cambia in base alla locale / al set di caratteri che stai utilizzando, quindi devi essere un po 'attento con quello.
Potresti provare questo
s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s)
Risultati:
'This must not b3 delet3d, but the number at the end yes'
la stessa regola si applica anche a
s = "This must not b3 delet3d, 4566 but the number at the end yes 134411"
re.sub("(\s\d+)","",s)
Risultati:
<*>>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*<*>quot;, "", s)
>>>s
" Questo non deve b3 delet3d, ma il numero alla fine si "
Questo rimuoverà i numeri alla fine della stringa.