2013-12-22 8 views
5

У меня есть полином, введенный пользователем, и я хочу использовать его только в том случае, если он содержит только символы в строке 1234567890^-+x.Как проверить, содержит ли строка только символы из заданного набора в python

Как я могу проверить, работает оно или нет, без использования внешних пакетов? Я хочу использовать только встроенные функции Python 2.5.

Я пишу программу, которая работает на любом Mac без необходимости использования внешних пакетов.

ответ

4
  1. Вы можете преобразовать действительные символы в set, поскольку наборы предлагают быстрее LookUp
  2. Затем вы можете использовать all функцию как этот

    valid_chars = set("1234567890^-+x") # Converting to a set 
    if all(char in valid_chars for char in input_string): 
        # Do stuff if input is valid 
    
  3. Мы можем преобразовать входную строку также набор и проверьте, находятся ли все символы в строке ввода в допустимом списке.

    valid_chars = set("1234567890^-+x") # Converting to a set 
    if set(input_string).issubset(valid_chars): 
        # Do stuff if input is valid 
    
+0

Устанавливает метод 'issuperset' для этого. – user2357112

+0

@ user2357112 Пожалуйста, проверьте мой ответ сейчас, я использовал 'issubset' – thefourtheye

+2

Это не синтаксис для превращения строки в набор; вы хотите 'set (" 1234567890^- + x ")'. (Почему я сначала увидел другое?) – user2357112

9

Используйте регулярное выражение:

import re 

if re.match('^[-0-9^+x]*$', text): 
    # Valid input 

Модуль re поставляется с Python 2.5, и это ваш самый быстрый вариант.

Демо:

>>> re.match('^[-0-9^+x]*$', '1x2^4-2') 
<_sre.SRE_Match object at 0x10f0b6780> 
+0

+1 для regex :) –

1
whitelist = '1234567890^-+x' 

str = 'x^2+2x+1' 
min([ch in whitelist for ch in str]) 
True 


str='x**2 + 1' 
min([ch in whitelist for ch in str]) 
False 
+0

'min()' вряд ли лучшая функция для этой задачи. –

+0

Согласитесь, что все будет лучшим выбором. Похмелье с других языков. –

12

Вот некоторые странные ;-) способов сделать это:

good = set('1234567890^-+x') 

if set(input_string) <= good: 
    # it's good 
else: 
    # it's bad 

или

if input_string.strip('1234567890^-+x'): 
    # it's bad! 
else: 
    # it's good 
+1

Мне нравится подмножество подмножества :-) Позаботьтесь об этом? –

+3

Почему бы не «хорошо».issuperset (input_string) '? – user2357112

+0

@MartijnPieters, не случайность - есть много способов сделать это, я не хочу тратить полчаса на их организацию ;-) –

2

насчет просто преобразующие как строку в комплект и проверку input_set is subset of good_set, как показано ниже:

>>> good_set = set('1234567890^-+x') 
>>> input_set1 = set('xajfb123') 
>>> input_set2 = set('122-32+x') 
>>> input_set1.issubset(good_set) 
False 
>>> input_set2.issubset(good_set) 
True 
>>> 
1

Еще один способ сделать это, теперь с помощью string.translate():

>>> import string 
>>> all_chars = string.maketrans('', '') 
>>> has_only = lambda s, valid_chars: not s.translate(all_chars, valid_chars) 
>>> has_only("abc", "1234567890^-+x.") 
False 
>>> has_only("x^2", "1234567890^-+x.") 
True 

Это не самый читаемый способ. Он должен быть одним из самых быстрых , если вам нужно.

+0

Вы можете передать как «Нет» в качестве первого аргумента для 'translate()' вместо этого. –

+1

@TimPeters: 'None' не работает на Python 2.5 – jfs

+1

У кого-нибудь еще есть Python 2.5 для проверки? LOL ;-) Он работает во всех * текущих * Pythons :-) –

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