快速从字符串中删除小写子串?

11 python string numpy

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

s = "FOObarFOOObBAR"
remove_lower(s) => "FOOFOOBAR"
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 21

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

>>> import string
>>> s.translate(None,string.ascii_lowercase)
'FOOFOOOBAR'
Run Code Online (Sandbox Code Playgroud)

我怀疑你会找到一种更快的方式,但timeit如果有人有动机,总会比较不同的选择:).

  • 这仅适用于字节字符串。如果字符串 `s` 是 unicode,上面的代码将失败并显示 `TypeError: translate() 只需要一个参数(给定 2 个)`。由于字符串在 Python 3 中默认是 unicode,这在 Python 3 中不起作用。 (4认同)
  • 字符串模块不被弃用吗? (2认同)
  • 我认为不推荐使用的是(方法的功能版本)方法.例如,在python 3.3中,只有像`ascii_lowercase`和`punctuation`这样的常量以及类似`Formatter`和`Template`的类.没有"rindex"或"split". (2认同)

Fac*_*sco 10

我的第一种方法是 ''.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
Run Code Online (Sandbox Code Playgroud)

  • 两个当前答案+1,但我更喜欢这个有两个原因.#1是我一直使用genexps,所以我不必考虑语法.我永远不会记得`translate`和`maketrans`是如何工作的.#2是这种方法更加强大:如果要求稍微改变,那么这种方法更有可能存活下来. (3认同)