2013-07-27 70 views

回答

3

如果你需要使用正則表達式,使用負字符類([^...]):

re.sub(r'[^a-zA-Z]', '', inputtext) 

一個否定的字符類匹配任何在類命名。

演示:

>>> import re 
>>> inputtext = 'The quick brown fox!' 
>>> re.sub(r'[^a-zA-Z]', '', inputtext) 
'Thequickbrownfox' 

但使用str.translate()方式更快:

import string 
ascii_letters = set(map(ord, string.ascii_letters)) 
non_letters = ''.join(chr(i) for i in range(256) if i not in ascii_letters) 
inputtext.translate(None, non_letters) 

使用str.translate()超過10倍,比一個正則表達式快

>>> import timeit, partial, re 
>>> ascii_only = partial(re.compile(r'[^a-zA-Z]').sub, '') 
>>> timeit.timeit('f(t)', 'from __main__ import ascii_only as f, inputtext as t') 
7.903045892715454 
>>> timeit.timeit('t.translate(None, m)', 'from __main__ import inputtext as t, non_letters as m') 
0.5990171432495117 

使用的Jakub的方法仍然比較慢:

>>> timeit.timeit("''.join(c for c in t if c not in l)", 'from __main__ import inputtext as t; import string; l = set(string.letters)') 
9.960685968399048 
+0

* *是多餘的 –

+0

@JonClements:它使替換更有效率;而不是用空字符串逐個替換每個字符,而是用空字符串替換匹配字符的*組*。 –

+0

@JonClements:Ick。 'timeit'表明添加'*'顯着減慢了這一點。刪除。 –

0

您可以使用regex

​​

你也可以管理沒有正則表達式(例如,如果你有正則表達式恐懼症):

import string 
new_string = ''.join(c for c in old_string 
        if c not in set(string.letters)) 

儘管我會使用正則表達式,但此示例具有其他教育值:set,comprehensionstring庫。請注意0​​這裏不是嚴格需要的

+0

您的正則表達式會更快,請參閱我的答案。:-) –

相關問題