Fastest way to do this is to use str.translate
:
>>> invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' ']
>>> s = '@#$%^&*fdsfs#$%^&*FGHGJ'
>>> s.translate(None, ''.join(invalid))
'fdsfsFGHGJ'
Timing comparisons:
>>> 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
On Python3 you need to do something like this:
>>> trans_tab = {ord(x):None for x in invalid}
>>> s.translate(trans_tab)
'fdsfsFGHGJ'