2010-10-10 7 views
40

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 

Répondre

31

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.

+1

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

+1

ne fonctionne pas pour unicode: translate() prend seulement un argument (table) avec unicode. – rikAtee

+4

moins 1: Pour faire quelque chose au sujet de la vitesse qui devrait être sur la clarté du code et la robustesse. – jwg

7

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 
45

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) 
8

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 
+2

Dans une classe de caractères regex vous n'avez pas besoin d'échapper quoi que ce soit, donc '[() {} <>]' est bien –

15

string.translate avec table = Aucun fonctionne très bien.

>>> name = "Barack (of Washington)" 
>>> name = name.translate(None, "(){}<>") 
>>> print name 
Barack of Washington 
+0

Cela ne fonctionne pas en Python 3 pour les chaînes, seulement pour les octets et bytearray. –

-2

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) 
+0

Comment cela enlève-t-il les parenthèses? En supprimant tout ce qui n'est pas alphanumérique? –

+0

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. –