Быстрый способ удалить строчные подстроки из строки?

Какой эффективный способ в Python (простой или с помощью numpy) удалить всю строчную подстроку из строки s?

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

Ответ 1

Я бы использовал str.translate. Только шаг удаления выполняется, если вы передаете None для таблицы переводов. В этом случае я передаю ascii_lowercase как буквы, которые нужно удалить.

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

Я сомневаюсь, что вы найдете более быстрый способ, но всегда timeit сравнивать разные параметры, если кто-то мотивирован:).

Ответ 2

Мой первый подход был бы ''.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

Ответ 3

import re

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

s = "FOObarFOOObBAR"
s = remove_lower(s)

print(s)