Come rimuovere i segni di punteggiatura da una stringa in Python 3.x utilizzo .translate()?

Voglio rimuovere tutti i segni di punteggiatura da un file di testo in uso .translate() metodo. Sembra funzionare bene in Python 2.x ma in Python 3.4 non sembra fare nulla.

Il mio codice è il seguente, l’uscita è la stessa di testo di input.

import string
fhand = open("Hemingway.txt")
for fline in fhand:
    fline = fline.rstrip()
    print(fline.translate(string.punctuation))
InformationsquelleAutor cybujan | 2015-12-15

 

4 Replies
  1. 158

    È necessario creare una tabella di conversione che utilizza maketrans che si passa al str.translate metodo.

    In Python 3.1 e versioni più recenti, maketrans è ora un metodo statico su str tipo, quindi è possibile utilizzarlo per creare una traduzione di ogni punteggiatura 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 dovrebbe uscita:

    string with punctuation inside of it Does this work I hope so
    • Questo è ben fatto. E ‘ un peccato che i primi risultati di Google per questo argomento sono obsoleto, lento, o più difficile da seguire.
    • Sembra che string.punctuation non includere le virgolette. Come possiamo modificare questo codice per tagliare i tasti in string.punctuation così come specificato dall’utente personaggi? Una o istruzione?
    • include citazioni (doppie e singole) – anche nel mio esempio si spoglia fuori delle virgolette. Se si desidera personalizzare ciò che viene spogliato oltre a str.punctuation, concatenare solo string.punctuation con una stringa di caratteri che si desidera anche rimosso, come translator = str.maketrans({key: None for key in string.punctuation + 'abc'}) se si desidera rimuovere la punteggiatura e le occorrenze dei caratteri a, b, o c.
    • I miei preventivi devono avere alcuni problemi di codifica, buono a sapersi. Grazie!
    • str.maketrans('', '', string.punctuation) anche il lavoro. Non c’è bisogno di loop, in ogni caso, anche str.maketrans(dict.fromkeys(string.punctuation)) sarebbe meglio qui.
    • grazie per le versioni migliorate, io aggiornare la mia risposta
    • Eccellente! Nota che io personalmente preferisco la tre-argomento di variante, perché creare un dizionario per str.maketrans() a trasformare in un altro dizionario; i tre argomenti versione solo passando un buon mercato stringa vuota (due volte) e la pre-esistenti string.punctuation oggetto.

  2. 22

    In python3.x ,esso può essere fatto utilizzando :

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

    La chiamata firma di str.tradurre è cambiato e a quanto pare il parametro deletechars è stato rimosso. Si potrebbe utilizzare

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

    invece, o creare una tabella come mostrato nell’altra risposta.

    • (@birryree esempio (stackoverflow.com/a/34294398/1656850) implora di essere in disaccordo con la tua disapprovazione editto sulla stringa.tradurre 😉
    • Hai ragione. Ho frainteso la documentazione su questo punto. Solo la chiamata firma è stata modificata: str.tradurre richiede solo un tavolo come parametro e non più deletechars (come si è visto in birryree risposta). Vorrei modificare la mia risposta di conseguenza.
    • Questa è l’unica soluzione che ho trovato che è di Python 2.7/3.6 compatibile. Io non riuscivo a trovare qualsiasi soluzione per uso translate() che avrebbe funzionato per Python 2.7 e 3.6.
  4. 2

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

    for ch in string.punctuation:                                                                                                     
        s = s.replace(ch, "'") 
    • Penso che tu non è sbagliato, ho eseguito il test(adottato nel tradurre la parte di test per python3) da stackoverflow.com/a/266162/4249707 Python 3.6.0b4 e come tanti anni fa sostituire schifo. I miei risultati – set : 2.7033574236556888 regex : 0.9831533581018448 tradurre : 1.837449918501079 sostituire : 5.498765277676284

Lascia un commento