快速删除字符串中的所有非字母字符,python

时间:2015-01-31 20:49:11

标签: python string time-complexity

我有以下问题。 我试图从字符串中删除所有非字母字符(意思是数字(string.digits),标点符号(string.punctuation),非ascii字符(如φ,χ,ψ等)。 这可以通过简单的命令轻松完成,如:

for i in str:
    if i not in string.ascii_letters: 
        data1 = str.replace(i,"")

或使用过滤器。 但是,我的问题是我的字符串的长度大约是20.000.000(几本书连在一起)。 现在在3.000.000个字符的情况下,上面的命令花了大约20分钟,因此我不敢用20.000.000个字符来尝试它。 你能告诉我是否真的有这么快的方法吗?

2 个答案:

答案 0 :(得分:4)

这样的事情可能会最终提高性能,因为你没有RAM中非常长字符串的副本:

data1 = (c for c in my_string if c in string.ascii_letters)

YMMV,但在我的系统上,需要6s才能过滤包含随机字节的20MB文件(包括获取字符串所需的"".join(...)操作):

>>> data1 = (c for c in my_string if chr(ord(c)) in string.ascii_letters)
>>> timeit.timeit('"".join(data1)', setup='from __main__ import data1')
5.96341991424560

RegExp替换花费了更多时间:

>>> timeit.timeit('re.sub("[^a-zA-Z]","",my_string)', setup='from __main__ import my_string; import re')
... still running after 90+ minutes...

答案 1 :(得分:2)

我认为正则表达式就是出于这种情况......

re.sub("[^a-zA-Z]","",my_string)