Je souhaite supprimer les crochets d'une chaîne. Pourquoi cela ne fonctionne-t-il pas correctement?Python strip() plusieurs caractères?
>>> name = "Barack (of Washington)"
>>> name = name.strip("(){}<>")
>>> print name
Barack (of Washington
Je souhaite supprimer les crochets d'une chaîne. Pourquoi cela ne fonctionne-t-il pas correctement?Python strip() plusieurs caractères?
>>> name = "Barack (of Washington)"
>>> name = name.strip("(){}<>")
>>> print name
Barack (of Washington
Je l'ai fait un test de temps ici, en utilisant chaque méthode 100000 fois dans une boucle. Les résultats m'ont surpris. (Les résultats me surprennent toujours après les éditer en réponse à la critique valable dans les commentaires.)
est ici le script:
import timeit
bad_chars = '(){}<>'
setup = """import re
import string
s = 'Barack (of Washington)'
bad_chars = '(){}<>'
rgx = re.compile('[%s]' % bad_chars)"""
timer = timeit.Timer('o = "".join(c for c in s if c not in bad_chars)', setup=setup)
print "List comprehension: ", timer.timeit(100000)
timer = timeit.Timer("o= rgx.sub('', s)", setup=setup)
print "Regular expression: ", timer.timeit(100000)
timer = timeit.Timer('for c in bad_chars: s = s.replace(c, "")', setup=setup)
print "Replace in loop: ", timer.timeit(100000)
timer = timeit.Timer('s.translate(string.maketrans("", "",), bad_chars)', setup=setup)
print "string.translate: ", timer.timeit(100000)
Voici les résultats:
List comprehension: 0.631745100021
Regular expression: 0.155561923981
Replace in loop: 0.235936164856
string.translate: 0.0965719223022
Résultats sur d'autres pistes suivre un modèle similaire. Si la vitesse n'est pas la principale préoccupation, cependant, je pense toujours string.translate
n'est pas le plus lisible; les trois autres sont plus évidents, quoique plus lents à des degrés divers.
strip
des bandes que des caractères de la même avant et arrière de la chaîne.
Pour supprimer une liste de caractères, vous pouvez utiliser la méthode translate
de la chaîne:
import string
name = "Barack (of Washington)"
table = string.maketrans('', '',)
print name.translate(table,"(){}<>")
# Barack of Washington
Parce que ce n'est pas ce que fait strip()
. Il supprime les caractères de début et de fin qui sont présents dans l'argument, mais pas les caractères au milieu de la chaîne.
Vous pouvez faire:
name= name.replace('(', '').replace(')', '').replace ...
ou:
name= ''.join(c for c in name if c not in '(){}<>')
ou peut-être utiliser une expression régulière:
import re
name= re.sub('[(){}<>]', '', name)
Because strip()
que des bandes de fuite et les personnages principaux, en fonction de ce que vous à condition de. Je suggère:
>>> import re
>>> name = "Barack (of Washington)"
>>> name = re.sub('[\(\)\{\}<>]', '', name)
>>> print(name)
Barack of Washington
Dans une classe de caractères regex vous n'avez pas besoin d'échapper quoi que ce soit, donc '[() {} <>]' est bien –
string.translate avec table = Aucun fonctionne très bien.
>>> name = "Barack (of Washington)"
>>> name = name.translate(None, "(){}<>")
>>> print name
Barack of Washington
Cela ne fonctionne pas en Python 3 pour les chaînes, seulement pour les octets et bytearray. –
Par exemple chaîne s="(U+007c)"
Pour enlever seulement les parenthèses de s, essayez les ci-dessous un:
import re
a=re.sub("\\(","",s)
b=re.sub("\\)","",a)
print(b)
Comment cela enlève-t-il les parenthèses? En supprimant tout ce qui n'est pas alphanumérique? –
Lorsque la question dit «enlever parenthèse» mais votre réponse dit «enlever tout ce qui n'est pas alphanumérique», je ne pense pas que vous répondez à la question. –
grâce à cette - question éducative, non seulement ai-je appris que la bande() ne fait pas ce que je pensais, j'ai aussi appris trois autres façons de réaliser ce que je voulais, et qui était le plus rapide! – AP257
ne fonctionne pas pour unicode: translate() prend seulement un argument (table) avec unicode. – rikAtee
moins 1: Pour faire quelque chose au sujet de la vitesse qui devrait être sur la clarté du code et la robustesse. – jwg