如何在 python 的输入字符串中忽略 [az][AZ] 以外的字符,以及在应用方法后字符串会是什么样子?
我需要使用正则表达式吗?
如果您需要使用正则表达式,请使用否定字符类 ( [^...]
):
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