I want to remove any brackets from a string. Why doesn't this work properly?

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

6 Answers

Because that's not what strip() does. It removes leading and trailing characters that are present in the argument, but not those characters in the middle of the string.

You could do:

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

or:

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

or maybe use a regex:

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

I did a time test here, using each method 100000 times in a loop. The results surprised me. (The results still surprise me after editing them in response to valid criticism in the comments.)

Here's the 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) 

Here are the results:

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

Results on other runs follow a similar pattern. If speed is not the primary concern, however, I still think string.translate is not the most readable; the other three are more obvious, though slower to varying degrees.

4

string.translate with table=None works fine.

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

Because strip() only strips trailing and leading characters, based on what you provided. I suggest:

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

strip only strips characters from the very front and back of the string.

To delete a list of characters, you could use the string's translate method:

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

For example string s="(U+007c)"

To remove only the parentheses from s, try the below one:

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy