2012-04-25 2 views
2

мне нужно проверить, если строка содержит только предустановленный список символов и делать что-то вроде:Как проверить, есть ли только определенные символы в строке?

my_string = '[email protected]#$%^' 
tmp = str.maketrans({'0': None, 'x': None, '#': None, '$': None, 'q': None, 'i': None}) 
if my_string.translate(tmp) == '': 
    print("Only predefined symbols!") 

есть лучший способ для достижения этой цели?

ответ

4
my_string = '[email protected]#$%^' 
predef = set('0x#$qi') 

if set(my_string).issubset(predef): 
    print "only predefined symbols" 
+1

Это аккуратно. Вы также можете использовать 'set (my_string) - predef', чтобы получить символы, которые не находятся в предопределенном наборе, что упростит обработку ошибок. – Johnsyweb

+0

удивительный, спасибо – user1355585

2

Я часто выступаю за альтернативы регулярному выражению, поскольку я думаю, что он часто используется в качестве решения, ищущего проблему, но в этом случае я считаю, что это может быть уместно.

import re 
pat = re.compile("^[0x#$qi]*$") 
my_string = '[email protected]#$%^' 
if pat.match(my_string): 
    print("Only predefined symbols!") 

Просто убедитесь, что если "]" это один из ваших предопределенных символов это первый символ в квадратных скобках.

Быстрое сравнение с установленным методом euromino показывает, что это в 3 раза быстрее, используя строки, которые вы использовали в своем вопросе. Создание временных интервалов было исключено из pat и predef, поэтому это сценарий «повторного использования». Если вы включите их, разница будет меньше, но regexp будет еще быстрее.

+0

Это может быть быстрее, но я вижу возможный источник ошибок при создании 'pat', где вам нужно реализовать правильное позиционирование возможного появления'] '. Кроме того, если '' 'содержится, он не может находиться в первой позиции, а' '' должен быть экранирован, и, возможно, есть что-то, что мы забыли. Слишком сложно, если во время исполнения изменяется список предопределенных символов. – eumiro

+0

Timeit показывает [@ eumiro's решение] (http://stackoverflow.com/a/10311693/78845) для запуска в 80% случаев на моем ноутбуке. – Johnsyweb

+0

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

Смежные вопросы