Python strip()去除多个字符?

96 投票
7 回答
265985 浏览
提问于 2025-04-16 05:16

我想从一个字符串中去掉所有的括号。为什么这样做不太有效呢?

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

7 个回答

17

在Python中,使用string.translate这个功能时,如果把表格设置为None,它是可以正常工作的。

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

因为这不是strip()的功能。它只会去掉字符串开头和结尾的特定字符,而不会去掉字符串中间的字符。

你可以这样做:

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

或者:

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

或者也可以使用正则表达式:

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

我在这里做了一个时间测试,循环使用每种方法100000次。结果让我很惊讶。(即使在根据评论中的有效批评进行编辑后,结果仍然让我感到惊讶。)

这是我的脚本:

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)

以下是结果:

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

其他运行的结果也大致相同。不过,如果速度不是最主要的考虑,我还是觉得 string.translate 这个方法不够直观;其他三种方法虽然速度稍慢,但更容易理解。

撰写回答