16

Python(普通或使用numpy)从字符串中删除所有小写子字符串的有效方法是什么s

s = "FOObarFOOObBAR"
remove_lower(s) => "FOOFOOBAR"
4

3 回答 3

26

Python3.x 答案:

您可以制作一个字符串翻译表。创建该转换表后,您可以重复使用它:

>>> import string
>>> table = str.maketrans('', '', string.ascii_lowercase)
>>> s = 'FOObarFOOObBAR'
>>> s.translate(table)
'FOOFOOOBAR'

当以这种方式使用时,第一个参数值映射到第二个参数值(如果存在)。如果不存在,则假定为恒等映射。第三个参数是要删除的值的集合。


对于关心的人来说,旧的 python2.x 答案:

我会用str.translate. None如果您通过转换表,则仅执行删除步骤。在这种情况下,我将ascii_lowercase作为要删除的字母传递。

>>> import string
>>> s = 'FOObarFOOObBAR'
>>> s.translate(None, string.ascii_lowercase)
'FOOFOOOBAR'

我怀疑您会找到更快的方法,但是timeit如果有人有动力,总会比较不同的选择:)。

于 2013-03-15T16:35:18.917 回答
15

我的第一种方法是''.join(x for x in s if not x.islower())

如果您需要速度,请使用 mgilson 答案,它会快很多。

>>> timeit.timeit("''.join(x for x in 'FOOBarBaz' if not x.islower())")
3.318969964981079

>>> timeit.timeit("'FOOBarBaz'.translate(None, string.ascii_lowercase)", "import string")
0.5369198322296143

>>> timeit.timeit("re.sub('[a-z]', '', 'FOOBarBaz')", "import re")
3.631659984588623

>>> timeit.timeit("r.sub('', 'FOOBarBaz')", "import re; r = re.compile('[a-z]')")
1.9642360210418701

>>> timeit.timeit("''.join(x for x in 'FOOBarBaz' if x not in lowercase)", "lowercase = set('abcdefghijklmnopqrstuvwxyz')")
2.9605889320373535
于 2013-03-15T16:37:11.193 回答
4
import re

remove_lower = lambda text: re.sub('[a-z]', '', text)

s = "FOObarFOOObBAR"
s = remove_lower(s)

print(s)
于 2013-03-15T16:51:37.470 回答