在Python3.3中删除字符串中除字母和空格以外的所有内容

在Python3.3中删除字符串中除字母和空格以外的所有内容,python,regex,python-3.3,translate,Python,Regex,Python 3.3,Translate,我有一个示例字符串:happy t00 go 129.129,我只想保留空格和字母。到目前为止,我所能想到的非常有效的方法是: print(re.sub("\d", "", 'happy t00 go 129.129'.replace('.', ''))) 但它只针对我的示例字符串。如何删除除字母和空格以外的所有字符 whitelist = set('abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ') myStr = "happy t

我有一个示例字符串:
happy t00 go 129.129
,我只想保留空格和字母。到目前为止,我所能想到的非常有效的方法是:

print(re.sub("\d", "", 'happy t00 go 129.129'.replace('.', '')))
但它只针对我的示例字符串。如何删除除字母和空格以外的所有字符

whitelist = set('abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ')
myStr = "happy t00 go 129.129$%^&*("
answer = ''.join(filter(whitelist.__contains__, myStr))
输出:

>>> answer
'happy t go '
使用集合补语:

re.sub(r'[^a-zA-Z ]+', '', 'happy t00 go 129.129')

inspectorG4dget的方法略有不同-从
字符串导入
&生成器理解:

from string import ascii_letters

allowed = set(ascii_letters + ' ')
myStr = 'happy t00 go 129.129'
answer = ''.join(l for l in myStr if l in allowed)
answer
# >>> 'happy t go '

性能比较: (我将myStr加长了一点,并预编译了regex,使事情变得更有趣)

每个回路53µs±6.43µs(7次运行的平均±标准偏差,每个10000个回路)
每个回路43.3µs±7.48µs(7次运行的平均±标准偏差,每个10000个回路)

每个循环26µs±509 ns(平均值±标准偏差为7次运行,每个循环10000次)

测试后,我发现当在命令提示符下以
python-m timeit-n 100-s
循环运行每个代码时,这比Joel的答案快0.0029 usec。@Gronk:
>Timer('''.join(filter(whitelist.\uu包含uuuuuuuuuuuuuuuuu,myStr)),''“…whitelist=set('abcdefghijklmnopqrstuvwxy'ABCDEFGHIJKLMNOPQRSTUVWXYZ')…myStr='happy t00 go 129.129'*10'')。timeit(number=1000)0.0249097314453125>>Timer('re.sub(r“[^a-zA-Z]”,“,myStr)”,'import re…myStr='happy t00 go 129.129'*10'')。timeit(number=1000)0.011039972305297852>>
。我的观点是0.0029 usec绝对在样本量为100的正常变化范围内。这也会过滤可能有问题的重音字母。小写字符“z”missingI发现这是最好的答案。它更具可读性,它显示了我们如何使用,而不是手动键入,这可能会很容易导致错误。所有答案都只包含24个字母,例如ß、Ä、Ö、Ü、Ą、Ż等。也许问题应该只提到ASCII字母?
import re
from string import ascii_letters, digits
myStr = 'happy t00 go 129.129'*20
allowed = set(ascii_letters + ' ')

# Generator
%timeit answer = ''.join(l for l in myStr if l in allowed)

# filter/__contains__
%timeit answer = ''.join(filter(allowed.__contains__, myStr))

# Regex
pat = re.compile(r'[^a-zA-Z ]+')
%timeit answer = re.sub(pat, '', myStr)