如何忽略[a-z] [A-Z]以外的字符

时间:2013-07-27 10:21:28

标签: python regex python-2.7

如何在python的输入字符串中忽略[a-z] [A-Z]以外的字符,并且在应用方法之后字符串会是什么样的?

我是否需要使用正则表达式?

2 个答案:

答案 0 :(得分:3)

如果您需要使用正则表达式,请使用否定字符类([^...]):

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

负字符类匹配类中命名的 not

演示:

>>> 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

答案 1 :(得分:0)

您可以使用regex

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

您也可以在没有正则表达式的情况下进行管理(例如,如果您有正则表达式恐惧症):

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

虽然我会使用正则表达式,但此示例还具有其他教育价值:setcomprehensionstring库。请注意,此处并不严格需要set