Il semble qu'il devrait y avoir un moyen plus simple que:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Y a-t-il?
python
string
punctuation
Lawrence Johnston
la source
la source
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" contient exactement UN caractère de ponctuation, le second "."string.punctuation
n'inclut pas du tout la ponctuation non anglaise. Je pense à。 ,!? : × “” 〟, etc.Réponses:
Du point de vue de l'efficacité, vous n'allez pas battre
Pour les versions supérieures de Python, utilisez le code suivant:
Il exécute des opérations de chaîne brutes en C avec une table de recherche - il n'y a pas grand-chose qui va battre cela, mais écrire votre propre code C.
Si la vitesse n'est pas un problème, une autre option est:
Ceci est plus rapide que le remplacement avec chaque caractère, mais ne fonctionnera pas aussi bien que les approches python non pures telles que les expressions régulières ou string.translate, comme vous pouvez le voir dans les timings ci-dessous. Pour ce type de problème, le faire au niveau le plus bas possible est payant.
Code temporel:
Cela donne les résultats suivants:
la source
table = string.maketrans("","")
devrait être remplacé partable = str.maketrans({key: None for key in string.punctuation})
?regex
est maintenant la méthode la plus efficace! Il est presque 2 fois plus rapide que la traduction. De plus, les ensembles et les remplacements ne sont plus si mauvais! Ils sont tous les deux améliorés d'un facteur 4 :)Les expressions régulières sont assez simples, si vous les connaissez.
la source
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Le tester avec python 3 sur linux, il fonctionne même sans le drapeau en utilisant des lettres tamoules, தமிழ்.Pour la commodité de l'utilisation, je résume la note de la ponctuation de striping d'une chaîne en Python 2 et Python 3. Veuillez vous référer à d'autres réponses pour la description détaillée.
Python 2
Python 3
la source
la source
str
Python 3 etunicode
Python 2, l'deletechars
argument n'est pas pris en charge.TypeError: translate() takes exactly one argument (2 given)
:(J'utilise habituellement quelque chose comme ça:
la source
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
est uniquement ASCII ! Une manière plus correcte (mais aussi beaucoup plus lente) consiste à utiliser le module unicodedata:Vous pouvez également généraliser et supprimer d'autres types de caractères:
Il supprime également les caractères
~*+§$
qui peuvent être ou non de la «ponctuation» selon le point de vue.la source
regex.sub(ur"\p{P}+", "", text)
~
ne font pas partie de la catégorie de ponctuation. Vous devez également tester également la catégorie Symboles.Pas nécessairement plus simple, mais d'une manière différente, si vous êtes plus familier avec la famille re.
la source
Pour les valeurs Python 3
str
ou Python 2unicode
,str.translate()
prend uniquement un dictionnaire; les points de code (entiers) sont recherchés dans ce mappage et tout ce quiNone
est mappé est supprimé.Pour supprimer (certains?) La ponctuation, utilisez:
La
dict.fromkeys()
méthode de classe simplifie la création du mappage, en définissant toutes les valeurs enNone
fonction de la séquence de clés.Pour supprimer toute ponctuation, pas seulement la ponctuation ASCII, votre table doit être un peu plus grande; voir la réponse de JF Sebastian (version Python 3):
la source
string.punctuation
n'est pas suffisant. Voir ma réponseunicode
objets vs les objets Python 2str
.string.punctuation
manque beaucoup de signes de ponctuation qui sont couramment utilisés dans le monde réel. Que diriez-vous d'une solution qui fonctionne pour la ponctuation non ASCII?Personnellement, je pense que c'est la meilleure façon de supprimer la ponctuation d'une chaîne en Python car:
\{S}
si vous souhaitez supprimer la ponctuation, mais gardez les symboles comme$
.\{Pd}
, ne supprimera que les tirets.Cela utilise les propriétés des caractères Unicode, dont vous pouvez en savoir plus sur Wikipédia .
la source
Je n'ai pas encore vu cette réponse. Utilisez simplement une expression régulière; il supprime tous les caractères à l'exception des caractères de mot (
\w
) et des caractères numériques (\d
), suivis d'un espace (\s
):la source
\d
est redondant car il s'agit d'un sous-ensemble de\w
.\w
dans la documentation: docs.python.org/3/library/re.htmlVoici une ligne pour Python 3.5:
la source
Ce n'est peut-être pas la meilleure solution, mais c'est ainsi que je l'ai fait.
la source
Voici une fonction que j'ai écrite. Ce n'est pas très efficace, mais c'est simple et vous pouvez ajouter ou supprimer toute ponctuation que vous désirez:
la source
la source
Juste comme une mise à jour, j'ai réécrit l'exemple @Brian en Python 3 et y ai apporté des modifications pour déplacer l'étape de compilation regex à l'intérieur de la fonction. Ma pensée ici était de chronométrer chaque étape nécessaire pour faire fonctionner la fonction. Peut-être que vous utilisez l'informatique distribuée et que vous ne pouvez pas partager d'objet regex entre vos employés et que vous devez avoir une
re.compile
étape sur chaque employé. Aussi, j'étais curieux de chronométrer deux implémentations différentes de maketrans pour Python 3contre
De plus, j'ai ajouté une autre méthode à utiliser set, où je profite de la fonction d'intersection pour réduire le nombre d'itérations.
Voici le code complet:
Voici mes résultats:
la source
la source
Voici une solution sans regex.
la source
Un one-liner pourrait être utile dans des cas pas très stricts:
la source
la source
la source
Pourquoi aucun de vous ne l'utilise?
Trop lent?
la source
En considérant unicode. Code vérifié en python3.
la source
Supprimer les mots vides du fichier texte à l'aide de Python
la source
J'aime utiliser une fonction comme celle-ci:
la source
abc.strip(string.punctuation)
place pour cela. Il ne supprimera pas ces caractères au milieu .