2010-10-10 18 views
40

Voglio rimuovere qualsiasi parentesi da una stringa. Perché questo non funziona correttamente?Python strip() più caratteri?

>>> name = "Barack (of Washington)" 
>>> name = name.strip("(){}<>") 
>>> print name 
Barack (of Washington 

risposta

31

ho fatto un test di tempo qui, utilizzando ogni metodo 100000 volte in un ciclo. I risultati mi hanno sorpreso. (I risultati ancora mi sorprende dopo averli modificati in risposta alle critiche valide nei commenti.)

Ecco lo 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) 

Ecco i risultati:

List comprehension: 0.631745100021 
Regular expression: 0.155561923981 
Replace in loop: 0.235936164856 
string.translate: 0.0965719223022 

Risultati su altre piste seguire un modello simile. Se la velocità non è la preoccupazione principale, tuttavia, penso ancora che lo string.translate non sia il più leggibile; gli altri tre sono più ovvi, anche se più lentamente a vari livelli.

+1

grazie per questo - domanda educativa, non solo ho imparato quella striscia() non fa quello che pensavo, ho anche imparato altri tre modi per ottenere ciò che volevo, e quale era il più veloce! – AP257

+1

non funziona per unicode: translate() accetta un solo argomento (tabella) con unicode. – rikAtee

+4

meno 1: per fare qualcosa sulla velocità che dovrebbe essere circa la chiarezza del codice e la robustezza. – jwg

7

strip solo strisce caratteri dalla parte anteriore e posteriore della stringa.

Per cancellare un elenco di caratteri, è possibile utilizzare il metodo translate della stringa:

import string 
name = "Barack (of Washington)" 
table = string.maketrans('', '',) 
print name.translate(table,"(){}<>") 
# Barack of Washington 
45

Perché non è quello che fa strip(). Rimuove i caratteri iniziali e finali presenti nell'argomento, ma non quei caratteri nel mezzo della stringa.

Si potrebbe fare:

name= name.replace('(', '').replace(')', '').replace ... 

o:

name= ''.join(c for c in name if c not in '(){}<>') 

o forse usare un espressione regolare:

import re 
name= re.sub('[(){}<>]', '', name) 
8

perché strip() solo strisce finali e principali personaggi, sulla base di ciò che si fornito. Suggerisco:

>>> import re 
>>> name = "Barack (of Washington)" 
>>> name = re.sub('[\(\)\{\}<>]', '', name) 
>>> print(name) 
Barack of Washington 
+2

In una classe di caratteri espressioni regolari non è necessario eseguire alcun escape, quindi '[() {} <>]' è corretto –

15

string.translate con tabella = Nessuno funziona correttamente.

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

Questo non funziona in Python 3 per le stringhe, solo per byte e bytearray. –

-2

Per esempio stringa s="(U+007c)"

a rimuovere solo le parentesi da s, provare i sotto uno:

import re 
a=re.sub("\\(","",s) 
b=re.sub("\\)","",a) 
print(b) 
+0

Come si rimuove la parentesi? Rimuovendo tutto ciò che non è alfanumerico? –

+0

Quando la domanda dice "rimuovi parentesi" ma la tua risposta dice "rimuovere tutto ciò che non è alfanumerico", non penso che tu stia affrontando la domanda. –