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>
set
, ya que los conjuntos ofrecen una búsqueda más rápida 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
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