Cómo verificar si una cadena contiene solo caracteres de un conjunto dado en python

Tengo un polinomio ingresado por el usuario y solo quiero usarlo si solo tiene caracteres en la cadena 1234567890^-+x .

¿Cómo puedo verificar si funciona o no sin usar paquetes externos? Solo quiero usar las funciones incorporadas de Python 2.5.

Estoy escribiendo un progtwig que se ejecuta en cualquier Mac sin necesidad de paquetes externos.

Aquí hay algunas formas extrañas 😉 de hacerlo:

 good = set('1234567890^-+x') if set(input_string) <= good: # it's good else: # it's bad 

o

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

Usa una expresión regular:

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

El módulo re viene con Python 2.5, y es su opción más rápida.

Manifestación:

 >>> re.match('^[-0-9^+x]*$', '1x2^4-2') <_sre.SRE_Match object at 0x10f0b6780> 
  1. Puede convertir los caracteres válidos en un set , ya que los conjuntos ofrecen una búsqueda más rápida
  2. Entonces puedes usar all funciones como esta

     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. Podemos convertir la cadena de entrada también en un conjunto y verificar si todos los caracteres de la cadena de entrada están en la lista válida.

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

¿Qué tal solo convertir la cadena en conjunto y comprobar que input_set is subset of good_set como se muestra a continuación?

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

Otra forma más de hacerlo, ahora usando 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 

No es la forma más legible. Debería ser uno de los más rápidos si lo necesitas.

 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