如何在python的输入字符串中忽略[a-z] [A-Z]以外的字符,并且在应用方法之后字符串会是什么样的?
我是否需要使用正则表达式?
答案 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))
虽然我会使用正则表达式,但此示例还具有其他教育价值:set
,comprehension和string库。请注意,此处并不严格需要set