web-dev-qa-db-fra.com

Comment supprimer des signes de ponctuation d'une chaîne dans Python 3.x en utilisant .translate ()?

Je souhaite supprimer tous les signes de ponctuation d'un fichier texte à l'aide de la méthode .translate (). Cela semble bien fonctionner sous Python 2.x mais sous Python 3.4, il ne semble rien faire.

Mon code est comme suit et le résultat est identique au texte saisi.

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

Vous devez créer une table de traduction à l'aide de maketrans que vous transmettez à la méthode str.translate.

Dans Python 3.1 et versions ultérieures, maketrans est maintenant un méthode statique sur le type str , vous pouvez donc l'utiliser pour créer une traduction de chaque la ponctuation que vous voulez 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))

Cela devrait produire:

string with punctuation inside of it Does this work I hope so
151
wkl

La signature d'appel de str.translate a été modifiée et le paramètre deletechars a apparemment été supprimé. Vous pourriez utiliser

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

au lieu de cela, ou créez un tableau comme indiqué dans l’autre réponse.

21
elzell

En python3.x, cela peut être fait en utilisant:

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

Je viens de comparer les trois méthodes par la vitesse. translate est plus lent que re.sub (avec précomilation) environ 10 fois. Et str.replace est plus rapide que re.sub 3 fois environ. Par str.replace je veux dire:

for ch in string.punctuation:                                                                                                     
    s = s.replace(ch, "'") 
2
imbolc