2015-12-15 86 views
29

Desidero rimuovere tutti i segni di punteggiatura da un file di testo utilizzando il metodo .translate(). Sembra funzionare bene con Python 2.x ma con Python 3.4 non sembra fare nulla.Come rimuovere i segni di punteggiatura da una stringa in Python 3.x usando .translate()?

Il mio codice è il seguente e l'uscita è lo stesso testo di input.

import string 
fhand = open("Hemingway.txt") 
for fline in fhand: 
    fline = fline.rstrip() 
    print(fline.translate(string.punctuation)) 

risposta

8

La firma richiamo della str.translate è cambiato e quanto pare i parametri deletechars è stato rimosso. Si potrebbe utilizzare

import re 
fline = re.sub('['+string.punctuation+']', '', fline) 

, invece, o creare una tabella come mostrato in altra risposta.

+0

perfetto, funziona eccellente! – cybujan

+0

(esempio @birryree (http://stackoverflow.com/a/34294398/1656850) chiede di non essere d'accordo con il tuo editto deprecazione su string.translate ;-) – boardrider

+0

Hai ragione. Ho frainteso la documentazione su questo punto. Solo la firma della chiamata è cambiata: str.translate prende solo una tabella come parametro e non più deletechars (come si vede nella risposta di birryree). Modificherò la mia risposta di conseguenza. – elzell

84

È necessario creare una tabella di conversione utilizzando maketrans passata al metodo str.translate.

In Python 3.1 e successivi, maketrans ora è un static-method on the str type, in modo da poter utilizzare per creare una traduzione di ogni punteggiatura che si desidera None.

import string 

# Thanks to Martijn Pieters for this improved version 

# This uses the 3-argument version of str.maketrans 
# with arguments (x, y, z) where 'x' and 'y' 
# must be equal-length strings and characters in 'x' 
# are replaced by characters in 'y'. 'z' 
# is a string (string.punctuation here) 
# where each character in the string is mapped 
# to None 
translator = str.maketrans('', '', string.punctuation) 

# This is an alternative that creates a dictionary mapping 
# of every character from string.punctuation to None (this will 
# also work) 
#translator = str.maketrans(dict.fromkeys(string.punctuation)) 

s = 'string with "punctuation" inside of it! Does this work? I hope so.' 

# pass the translator to the string's translate method. 
print(s.translate(translator)) 

Questo stamperà:

string with punctuation inside of it Does this work I hope so 
+1

Questo è ben fatto. È un peccato che i principali risultati di Google per questo argomento siano deprecati, più lenti o più difficili da seguire. – rurp

+1

Sembra che 'string.punctuation' non includa virgolette. Come modifichiamo questo codice per tagliare con le chiavi in ​​'string.punctuation' così come i caratteri specificati dall'utente? Una dichiarazione o? –

+1

@ArashHowaida 'string.punctuation' include virgolette (sia doppie che singole) - anche nel mio esempio toglie le virgolette. Se vuoi personalizzare ciò che viene spogliato in aggiunta a 'str.punctuation', basta concatenare' string.punctuation' con una stringa di caratteri che vuoi rimuovere, come 'translator = str.maketrans ({key: None for key in string .punctuation + 'abc'}) 'se si desidera rimuovere la punteggiatura e qualsiasi occorrenza dei caratteri' a', 'b' o' c'. – birryree

0

Ho appena confrontato i tre metodi di velocità. translate è più lento di re.sub (con precomposizione) in circa 10 volte. E str.replace è più veloce di re.sub in circa 3 volte. Con str.replace voglio dire:

for ch in string.punctuation:                          
    s = s.replace(ch, "'") 
+1

Penso che tu stia sbagliando eseguo i test (adottato in translate test part per python3) da http://stackoverflow.com/a/266162/4249707 su Python 3.6.0b4 e come molti anni fa sostituisco succhi. I miei risultati - set: 2.7033574236556888 regex: 0.9831533581018448 tradurre: 1.837449918501079 sostituire: 5.498765277676284 –

4

In python3.x, si può fare utilizzando:

import string 
#make translator object 
translator=str.maketrans('','',string.punctuation) 
string_name=string_name.translate(translator) 
Problemi correlati