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ì

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top