Expresiones regulares usando Python 3

Expresiones regulares usando Python 3
Las expresiones regulares a menudo se ven como esta serie realmente oscura de jeroglíficos que típicamente se copia de Internet y pasan en su código. Este hechizo misterioso muestra capacidades mágicas de encontrar patrones dentro de las cuerdas de texto y si lo preguntamos muy bien, incluso nos hará el favor de reemplazar un patrón dado dentro de una cadena con algo más agradable.

Por ejemplo, cuando está escribiendo manejadores para URL (y Dios lo ayude si está escribiendo uno desde cero), entonces a menudo desea mostrar el mismo resultado independientemente de los siguientes '/' en la URL en la URL. mi.g https: // ejemplo.com/usuario/configuración/y https: // ejemplo.com/usuario/configuración debe apuntar a la misma página a pesar del final '/'.

Sin embargo, no puede ignorar todas las barras delanteras, como:

  1. La barra de reenvío entre 'usuario' y 'configuración', e, 'usuario/configuración'.
  2. También tendrá que tener en cuenta el '//' al comienzo de su FQDN seguido de 'HTTPS'.

Entonces, se te ocurre una regla como: “Ignora solo las barras delanteras seguidas de un espacio vacío."Y si lo desea, puede codificar esa regla con una serie de declaraciones if-else. Pero eso se pondrá engorroso bastante rápido. Puede escribir una función que diga Cleanurl () que puede encapsular esto para usted. Pero el universo pronto comenzará a arrojarte más bolas curvas. Pronto se encontrará escribiendo funciones para CleanHeaders (), ProcessLog (), etc. O puede usar una expresión regular siempre que se requiera cualquier tipo de coincidencia de patrones.

IO y archivos estándar

Antes de entrar en los detalles de las expresiones regulares, vale la pena mencionar el modelo que la mayoría de los sistemas tienen para flujos de texto. Aquí hay un resumen corto (incompleto):

  1. El texto se procesa como un flujo (único) de caracteres.
  2. Esta transmisión puede originarse en un archivo de texto unicode o ASCII o desde entrada estándar (teclado) o desde una conexión de red remota. Después del procesamiento, por ejemplo, por un script regex, la salida va a un archivo o secuencia de red o la salida estándar (e.G, consola)
  3. La transmisión consiste en una o más líneas. Cada línea tiene cero o más caracteres seguidos de una nueva línea.

En aras de la simplicidad, quiero que imagine que un archivo está compuesto de líneas que terminan con un carácter nuevo. Dividimos este archivo en líneas individuales (o cadenas) cada uno que termina con una nueva línea o un carácter normal (para la última línea).

Regexs y cadena

Un regex no tiene nada, particular, que ver con los archivos. Imagínelo como un cuadro negro que puede tomar como entrada cualquier cadena arbitraria de cualquier longitud (finita) y una vez que alcanza el final de esta cadena, puede:

  1. Acepta la cadena. En otras palabras, la cadena partidos la expresión regular (regex).
  2. Rechazar la cadena, yo.E, la cadena no fósforo la expresión regular (regex).

A pesar de su naturaleza de caja negra, agregaré algunas limitaciones más a esta maquinaria. Un regex lee una cadena secuencialmente, De izquierda a derecha, y solo lee un personaje a la vez. Entonces una cadena "Linuxhint" con ser leído como:

'L "i" n "u" x "h" i "n" t' [de izquierda a derecha]

Empecemos simple

El tipo más simplista de regex sería buscar y hacer coincidir una cadena 'c'. La expresión regular para ello es solo 'c'. Bastante trivial. La forma de hacerlo en Python requeriría que primero importe el re Módulo para expresiones regulares.

>>> importar re

Luego usamos la función RE.buscar(patrón, cadena) dónde patrón es nuestra expresión regular y cadena en la cadena de entrada dentro de la cual buscamos el patrón.

>>> Re.buscar ('c', 'Esta oración tiene una C deliberada')

La función toma en el patrón 'C', lo busca en la cadena de entrada e imprime la ubicación (amplio) donde se encuentra dicho patrón. Esta parte de la cadena, esta subcadena es lo que coincide con nuestra expresión regular. Si no hubiera tal coincidencia encontrada, la salida sería un Ninguno objeto.

Del mismo modo, puede buscar el patrón 'expresión regular' de la siguiente manera:

>>> Re.búsqueda ("expresión regular", "podemos usar expresiones regulares para buscar patrones.")

re.buscar (), re.Match () y RE.Partido completo()

Tres funciones útiles del módulo RE incluyen:

re.buscar(patrón, cadena)

Esto devuelve la subconjunto que coincide con el patrón, como hemos visto arriba. Si no se encuentra ninguna coincidencia, entonces Ninguno es regresado. Si múltiples subcadenas se ajustan a un patrón dado, solo se informa la primera ocurrencia.

re.fósforo(patrón, cadena)

Esta función intenta coincidir con el patrón suministrado desde el comienzo de la cadena. Si se encuentra con un descanso en algún lugar a mitad de camino, regresa Ninguno.

Por ejemplo,

>>> Re.Match ("Joh", "John Doe")

Donde como la cadena "mi nombre es John Doe" no es un partido, y por lo tanto Ninguno es regresado.

>>> imprimir (RE.Match ("Joh", "Mi nombre es John Doe"))
Ninguno

re.Partido completo(patrón, cadena)

Esto es más estricto que el anterior e intenta encontrar una coincidencia exacta del patrón en la cadena, de lo contrario, predeterminado a Ninguno.

>>> imprimir (RE.Fullmatch ("Joh", "Joh"))

# Cualquier otra cosa no será un partido

Estaré usando solo el re.buscar() función en el resto de este artículo. Cada vez que digo que el Regex acepta esta cadena, significa que ATE re.buscar() La función ha encontrado una subcadena coincidente en la cadena de entrada y ha devuelto eso, en lugar de Ningunoobjeto.

Caracteres especiales

Las expresiones regulares como 'John' y 'C' no son de gran uso. Necesitamos caracteres especiales que una media específica en el contexto de expresiones regulares. Aquí están algunos ejemplos:

    1. ^ - Esto coincide con el comienzo de una cadena. Por ejemplo, '^C' coincidirá con todas las cuerdas que comienzan con la letra C.
    2. $ - Esto coincide con el final de la línea.
    3. . - El punto es indicar uno o más caracteres, excepto la nueva línea.
    4. * - Esto es a cero o más carácter de lo que lo precedió. Entonces B* coincide 0 o más de B de B. AB* coincide solo A, AB y un
    5. + - Esto es para uno o más carácter de lo que lo precedió. Entonces B+ coincide con 1 o más ocurrencias de B. AB* coincide solo A, AB y un
    6. \ - La barra de retroceso se usa como secuencia de escape en los reglas. Entonces, desea una expresión regular para buscar la presencia literal del símbolo de dólar '$' en lugar del final de la línea. Puedes escribir \ $ en expresión regular.
    7. Los aparatos ortopédicos rizados se pueden usar para especificar el número de repeticiones que desea ver. Por ejemplo, un patrón como AB 10 significa la cadena A seguida de 10 B coincidirá con este patrón. También puede especificar un rango de números, como b 4,6, las cadenas de coincidencias que contienen B repetidas de 4 a 6 veces consecutivamente. El patrón para 4 o más repeticiones requeriría solo una coma trasera, como B 4,
    8. Brackets cuadrados y rango de personajes. Re Like [0-9] puede actuar como un marcador de posición para cualquier dígito entre 0 y 9. Del mismo modo, puede tener dígitos entre uno y cinco [1-5] o para igualar cualquier uso de letras mayúsculas [A-Z] o para cualquier letra del alfabeto, independientemente de que sea el uso superior o minúscula [A-Z].
      Por ejemplo, cualquier cadena hecha de exactamente diez dígitos coincide con la expresión regular [0-9] 10, bastante útil cuando busca números de teléfono en una cadena dada.
    9. Puede crear una declaración o me gusta, usando | carácter donde una expresión regular se compone de dos o más expresiones regulares, digamos, A y B. El Regex A | B es una coincidencia si la cadena de entrada es una coincidencia para la expresión regular A o para B.
    10. Puedes agrupar diferentes reglas juntos. Por ejemplo, el regex (a | b) c coincidirá con regexas para AC y

Hay mucho más que cubrir, pero recomendaría aprender a medida que avanza en lugar de sobrecargar su cerebro con muchos símbolos y casos de borde oscuros. En caso de duda, los documentos de Python son de gran ayuda y ahora sabes lo suficiente como para seguir los documentos fácilmente.

Experiencia práctica y referencias

Si desea ver una interpretación visual de su regex, puede visitar DebugGex. Este sitio genera una vista de su regex en tiempo real y le permite probarlo con varias cadenas de entrada.

Para saber más sobre el aspecto teórico de las expresiones regulares, es posible que desee ver los primeros dos capítulos de introducción a la teoría de la computación por Michael Sipser. Es muy fácil de seguir y muestra la importancia de las expresiones regulares como un concepto central de cálculo en sí mismo!