最简单的清理字符串

alp*_*ric 2 python string for-loop if-statement strip

清除用户输入的字符串的简单方法是什么?这是我在清理混乱时依赖的代码.如果有一个更简单的智能版本可用,那就太好了.

invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' ']
for c in invalid: 
    if len(line)>0: line=line.replace(c,'')
Run Code Online (Sandbox Code Playgroud)

PS我如何将这个(使用嵌套if)函数放在一行上?

Dan*_*Dan 5

import re
re.sub('[#@$%^&*()-+!]', '', line)
Run Code Online (Sandbox Code Playgroud)

re是正则表达式模块.使用方括号意味着"匹配括号内的任何一个东西".所以调用说," line在括号内找到任何东西,并用任何东西替换它('').


Ash*_*ary 5

最快的方法是使用str.translate:

>>> invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' ']
>>> s = '@#$%^&*fdsfs#$%^&*FGHGJ'
>>> s.translate(None, ''.join(invalid))
'fdsfsFGHGJ'
Run Code Online (Sandbox Code Playgroud)

时间比较:

>>> s = '@#$%^&*fdsfs#$%^&*FGHGJ'*100

>>> %timeit re.sub('[#@$%^&*()-+!]', '', s)
1000 loops, best of 3: 766 µs per loop

>>> %timeit re.sub('[#@$%^&*()-+!]+', '', s)
1000 loops, best of 3: 215 µs per loop

>>> %timeit "".join(c for c in s if c not in invalid)
100 loops, best of 3: 1.29 ms per loop

>>> %timeit re.sub(invalid_re, '', s)
1000 loops, best of 3: 718 µs per loop

>>> %timeit s.translate(None, ''.join(invalid))         #Winner
10000 loops, best of 3: 17 µs per loop
Run Code Online (Sandbox Code Playgroud)

在Python3上你需要做这样的事情:

>>> trans_tab = {ord(x):None for x in invalid}
>>> s.translate(trans_tab)
'fdsfsFGHGJ'
Run Code Online (Sandbox Code Playgroud)