2014-01-29 3 views
2

Что было бы простым простым способом очистки введенной пользователем строки. Вот код, на который я полагаюсь, читая беспорядок. Было бы здорово, если бы была более короткая интеллектуальная версия.Очистка строки от самого простого

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

PS Как я могу поместить это для (с вложенными if) функциями в одну строку?

ответ

5

Самый быстрый способ сделать это состоит в использовании str.translate:

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

Временные сравнения:

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

На Python3 вам нужно сделать что-то вроде этого:

>>> trans_tab = {ord(x):None for x in invalid} 
>>> s.translate(trans_tab) 
'fdsfsFGHGJ' 
5
import re 
re.sub('[#@$%^&*()-+!]', '', line) 

re - модуль регулярного выражения. Использование квадратных скобок означает «соответствовать любой из этих вещей внутри скобок». . Так говорит призыв, «найти что-нибудь в line внутри скобок и заменить его ничем ('')

+0

Кстати, если вы хотите, чтобы очистить квадратные скобки тоже, вы должны бежать правую одно: 're.sub ('[# @ $%^& *() - +! [\]] ',' ', line) '. – Dan

4

Вы можете сделать это следующим образом:

from string import punctuation # !"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~ 

line = "".join(c for c in line if c not in punctuation) 

Например:

'hello, I @m pleased to meet you! How *about (you) try something > new?' 

становится

'hello I m pleased to meet you How about you try something new' 
1

Это один случай, когда регулярное выражение Полезно.

>>> invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' '] 
>>> import re 
>>> invalid_re = '|'.join(map(re.escape, invalid)) 
>>> re.sub(invalid_re, '', 'foo * bar') 
'foobar' 
1

Вот фрагмент, который я использую в своем собственном коде. В основном вы используете регулярное выражение, чтобы указать, какие символы разрешены, сопоставлять их, а затем объединять их вместе.

import re 

def clean(string_to_clean, valid='ACDEFGHIKLMNPQRSTVWY'): 
    """Remove unwanted characters from string. 

    Args: 
    clean: (str) The string from which to remove 
    unwanted characters. 

    valid_chars: (str) The characters that are valid and should be 
    included in the returned sequence. Default character 
    set is: 'ACDEFGHIKLMNPQRSTVWY'. 

    Returns: (str) A sequence without the invalid characters, as a string. 

    """ 
    valid_string = r'([{}]+)'.format(valid) 
    valid_regex = re.compile(valid_string, re.IGNORECASE) 

    # Create string of matching characters, concatenate to string 
    # with join(). 
    return (''.join(valid_regex.findall(string_to_clean))) 
1

Используйте простой список понимание:

>>> invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' '] 
>>> x = 'foo * bar' 
>>> "".join(i for i in x if i not in invalid) 
'foobar' 

Использование списка понимание с string.punctuation + \s:

>>> import string 
>>> x = 'foo * bar' 
>>> "".join(i for i in x if i not in string.punctuation) 
'foo bar' 
>>> "".join(i for i in x if i not in string.punctuation+" ") 
'foobar' 

Использование str.translate:

>>> invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' '] 
>>> x = 'foo * bar' 
>>> x.translate(None,"".join(invalid)) 
'foobar' 

Использование re.sub:

>>> import re 
>>> invalid = ['#','@','$','$','%','^','&','*','(',')','-','+','!',' '] 
>>> x = 'foo * bar' 
>>> y = "["+"".join(invalid)+"]" 
>>> re.sub(y,'',x) 
'foobar' 
>>> re.sub(y+'+','',x) 
'foobar' 
1

Это работает

invalid = '#@$%^_ ' 
line = "#master_Of^Puppets#@$%Yeah" 
line = "".join([for l in line if l not in invalid]) 
#line will be - 'masterOfPuppetsYeah' 
Смежные вопросы