J'ai une chaîne avec laquelle je voudrais supprimer toute ponctuation. J'utilise actuellement:

import string
translator = str.maketrans('','', string.punctuation)
name = name.translate(translator)

Cependant, pour les chaînes qui sont des noms, cela a également supprimé le trait d'union, que je voudrais conserver dans la chaîne. Par exemple '\ Fred-Daniels! "Devrait devenir" Fred-Daniels ".

Comment puis-je modifier le code ci-dessus pour y parvenir?

2
labjunky 1 août 2017 à 04:08

2 réponses

Meilleure réponse

Si vous souhaitez exclure certains caractères de ponctuation de string.puncation, vous pouvez simplement supprimer ceux que vous ne souhaitez pas prendre en compte:

>>> from string import punctuation
>>> from re import sub
>>> 
>>> string = "\Fred-Daniels!"
>>> translator = str.maketrans('','', sub('\-', '', punctuation))
>>> string
'\\Fred-Daniels!'
>>> string = string.translate(translator)
>>> string
'Fred-Daniels'

Notez que si vous ne souhaitez exclure qu'un ou deux caractères, vous devez utiliser str.replace. Sinon, il vaut mieux s'en tenir à re.sub.

7
Christian Dean 1 août 2017 à 01:13

Selon le cas d'utilisation, il peut être plus sûr et plus clair de lister explicitement les caractères valides:

>>> name = '\\test-1.'
>>> valid_characters = 'abcdefghijklmnopqrstuvwxyz1234567890- '
>>> filtered_name = ''.join([ x for x in name if x.lower() in valid_characters ])
>>> print(filtered_name)
test-1

Notez que de nombreuses personnes ont des noms qui incluent des signes de ponctuation, comme "Mary St. Cloud-Stevens", "Jim Chauncey, Jr.", etc.

1
Brian 1 août 2017 à 02:01