Un Regex ( expresión regular ) es una secuencia de caracteres que se utiliza para definir un patrón. Este patrón podría usarse para buscar, reemplazar y otras operaciones. Regex se utiliza ampliamente en aplicaciones que requieren validación de entrada, validación de contraseña, reconocimiento de patrones, utilidades de búsqueda y reemplazo (que se encuentran en los procesadores de texto), etc. Esto se debe al hecho de que la sintaxis de regex permanece igual en diferentes lenguajes de programación e implementaciones. Por lo tanto, uno que lo comprenda proporciona longevidad en todos los idiomas. En este artículo, crearemos un programa para verificar la validez de una string de expresiones regulares.
El método que usaríamos requerirá una comprensión firme de la construcción try-except de python. Por lo tanto, sería prudente si tocáramos eso antes de pasar al código real.
Manejo de excepciones
Try except block se usa para capturar y manejar las excepciones encontradas durante la ejecución de un bloque de código en particular (la construcción existe en otros lenguajes de programación bajo el nombre try-catch ). La sintaxis general de un bloque try-except es la siguiente:
probar:
# Ejecutar este código
.
.
excepto [Excepción] :
# Ejecutar este código, si surge una excepción durante la ejecución del bloque de prueba
.
.
En la sintaxis anterior, se ejecutaría cualquier código que se encuentre dentro del bloque de prueba. Si surge una excepción/error durante la ejecución del bloque de prueba, entonces (solo) se ejecuta el bloque de excepción. Si el bloque de prueba se ejecuta sin producir una excepción, entonces el bloque de excepción no se ejecutará. Si se usa una cláusula excepto simple, entonces detectaría cualquier excepción (e incluso ciertas System_Exits) encontrado durante la ejecución del bloque try. Para evitar que esto suceda, generalmente es una buena práctica especificar una excepción después de except. Esto asegura que solo después de encontrar esa excepción/error específico, se ejecutará el bloque de excepción. Esto evita la ocultación de otros errores encontrados durante la ejecución del bloque try. Además, se pueden usar varias cláusulas de excepción dentro del mismo bloque try-except, lo que le permite atrapar una gran cantidad de excepciones y tratarlas específicamente. Esta construcción contiene otras palabras clave, como finalmente, más, etc., que no son necesarias en el contexto actual. Por lo tanto, solo se describen las secciones relevantes.
Código:
En el siguiente código, estaríamos especificando re.error como la excepción en la cláusula de excepción del bloque try-except. Este error se encuentra cuando se encuentra un patrón de expresiones regulares no válido, durante la compilación del patrón.
Python3
import re # pattern is a string containing the regex pattern pattern = r"[.*" try: re.compile(pattern) except re.error: print("Non valid regex pattern") exit()
Non valid regex pattern
Explicación:
En primer lugar, importamos la biblioteca re, para habilitar la funcionalidad de expresiones regulares en nuestro código. Luego asignamos una string que contiene el patrón regex al patrón variable. El patrón proporcionado no es válido ya que contiene una clase de carácter no cerrada (en los corchetes regex `[ ]` se utilizan para definir una clase de carácter). Colocamos la función re.compile() (utilizada para compilar patrones de expresiones regulares) dentro del bloque de prueba. Esto primero intentará compilar el patrón y si ocurre alguna excepción durante la compilación, primero verificará si es un error., si es así, solo se ejecutará el bloque excepto. De lo contrario, la excepción se mostrará en el rastreo, lo que provocará la finalización del programa. El bloque de excepción contiene declaraciones de impresión que envían el mensaje definido por el usuario a la salida estándar y luego sale del programa (a través de exit() ). Dado que el patrón proporcionado no es válido (explicado anteriormente), esto lleva a que se ejecute el bloque de excepción.
Nota:
El código anterior solo se ocupa de la excepción re.error . Pero también existen otras excepciones relacionadas con las expresiones regulares, como RecursionError , que debe tratarse específicamente (agregando una cláusula de excepción separada para esa excepción también o cambiando la profundidad máxima de la pila usando sys.setrecursionlimit() a partir de este caso).
Comprobando si la string de entrada coincide con el patrón Regex
En el siguiente ejemplo, probaremos si una string de entrada coincide con un patrón de expresión regular dado o no. Esto supone que el patrón de expresiones regulares es válido (podría asegurarse usando el ejemplo mencionado anteriormente). Estaríamos comprobando si la string de entrada es una string alfanumérica (una que contiene letras o dígitos en toda su longitud) o no. Estaríamos usando la siguiente clase para verificar la string:
^[A-Za-z0-9]+$
Aunque existe una secuencia especial en expresiones regulares ( \w ) para encontrar caracteres alfanuméricos. Pero no lo usaremos porque contiene el guión bajo (_) en su clase de carácter (A-Za-z0-9 _ ), que no se considera un carácter alfanumérico según la mayoría de los estándares.
Código:
Python3
import re # compiling the pattern for alphanumeric string pat = re.compile(r"[A-Za-z0-9]+") # Prompts the user for input string test = input("Enter the string: ") # Checks whether the whole string matches the re.pattern or not if re.fullmatch(pat, test): print(f"'{test}' is an alphanumeric string!") else: print(f"'{test}' is NOT a alphanumeric string!")
Producción:
> Enter the string: DeepLearnedSupaSampling01 'DeepLearnedSupaSampling01' is an alphanumeric string!
> Enter the string: afore 89df 'afore 89df' is NOT a alphanumeric string!
Explicación:
En primer lugar, compilamos el patrón de expresiones regulares usando re.compile() . El patrón Regex contiene un conjunto de caracteres que se usa para especificar que todos los alfabetos (minúsculas y mayúsculas) y dígitos (0-9) se incluirán en el patrón. Después de la clase está el signo más (+), que es un calificador de repetición. Esto permite que la búsqueda de expresión regular resultante coincida con 1 o más repeticiones de la expresión regular anterior (para nosotros, que es el conjunto de caracteres alfanuméricos). Luego le solicitamos al usuario la string de entrada. Después de lo cual pasamos la string de entrada y compilamos el patrón de expresiones regulares a re.fullmatch() . Este método comprueba si toda la string coincide o no con el patrón de expresión regular. Si lo hace, devuelve 1, de lo contrario, un 0. Que usamos dentro del if-elseconstruir para mostrar el mensaje de éxito/fracaso en consecuencia.