快速移除字符串中的小写子串的方法?

17 投票
4 回答
13996 浏览
提问于 2025-04-17 19:14

在Python中,有什么简单有效的方法可以从一个字符串s中去掉所有的小写子串呢?可以使用普通的Python方法或者用numpy库。

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

4 个回答

4
import re

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

s = "FOObarFOOObBAR"
s = remove_lower(s)

print(s)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

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
27

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 来比较不同的选项 :).

撰写回答