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

Python 如何忽略[a-z][a-z]以外的字符,python,regex,python-2.7,Python,Regex,Python 2.7,在python中,如何忽略输入字符串中除[a-z][a-z]以外的字符,以及在应用该方法后,字符串将是什么样子 是否需要使用正则表达式?如果需要使用正则表达式,请使用负字符类([^…]): 负字符类匹配类中未命名的任何内容 演示: 但是使用str.translate()要快得多: 使用str.translate()比正则表达式快10倍以上: >>> import timeit, partial, re >>> ascii_only = partial(re.c

在python中,如何忽略输入字符串中除[a-z][a-z]以外的字符,以及在应用该方法后,字符串将是什么样子


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

如果需要使用正则表达式,请使用负字符类(
[^…]
):

负字符类匹配类中未命名的任何内容

演示:

但是使用
str.translate()
要快得多:

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

如果需要使用正则表达式,请使用负字符类(
[^…]
):

负字符类匹配类中未命名的任何内容

演示:

但是使用
str.translate()
要快得多:

使用
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
您可以使用:

您也可以不使用正则表达式进行管理(例如,如果您有正则表达式恐惧症):

虽然我会使用regex,但这个例子还有额外的教育价值:、和库。请注意,
设置
在这里不是严格需要的

您可以使用:

您也可以不使用正则表达式进行管理(例如,如果您有正则表达式恐惧症):


虽然我会使用regex,但这个例子还有额外的教育价值:、和库。请注意,
set
在这里并不是严格需要的

*
是redundant@JonClements:它使更换更加高效;它不是用空字符串逐个替换每个字符,而是用空字符串替换匹配字符组。@JonClements:Ick
timeit
显示添加
*
会显著降低速度。删除。+1用于测试我的代码段,以及
translate()
。我很惊讶我的理解比正则表达式慢。显然,阅读@JakubM的时间到了:通过使用列表理解而不是生成器表达式,可以在一百万次运行中节省0.5秒(因此
''.join([…])
,但这还是比较慢的。那是redundant@JonClements:它使替换更加有效;它不是用空字符串单独替换每个字符,而是用空字符串替换匹配字符组。@JonClements:Ick.
timeit
显示添加
*
si这大大减慢了速度。删除了。+1用于测试我的代码段和
translate()
。我很惊讶我的理解速度比regex慢。显然是阅读@JakubM的时间。通过使用列表理解而不是生成器表达式,你可以在一百万次运行中节省0.5秒(因此
'.join([…])
,但速度仍然较慢。正则表达式会更快,请参见我的答案。:-)正则表达式会更快,请参见我的答案。:-)
>>> 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
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))