Coincidencia de cadenas de Python sin sintaxis RegEx compleja


Foto por autor

Tengo una relación de amor y odio con las expresiones regulares (RegEx) en Python en particular. Me encanta cómo puedes extraer o hacer coincidir cadenas sin escribir demasiadas funciones booleanas. Esto es mejor que la función de búsqueda de cadenas.

Lo que no me gusta es lo difícil que me resulta aprender y comprender los patrones RegEx. Puedo manejar la coincidencia de cadenas simple, como extraer todos los caracteres alfanuméricos y limpiar el texto para las tareas de NLP. Las cosas se complican cuando se trata de extraer direcciones IP, correos electrónicos e identificaciones de texto basura. Debe escribir un patrón de cadena RegEx complejo para extraer el elemento requerido.

Para simplificar las tareas RegEx complejas, aprenderemos sobre un paquete de Python simple llamado pregex. Además, también veremos varios ejemplos de extracción de fechas y correos electrónicos de una larga cadena de texto.

Pregex Es una API de nivel superior construida sobre el módulo `re`. Es RegEx sin patrones RegEx complejos, lo que facilita que cualquier programador entienda y recuerde expresiones regulares. Además, no necesita agrupar patrones o escapar metacaracteres, y es modular.

Simplemente puede instalar la biblioteca usando PIP.

Usaremos un código de muestra modificado para probar la poderosa funcionalidad de PREgEx documentos.

En el siguiente ejemplo, extraemos una URL HTTP o una dirección IPv4 con un número de puerto. No necesitamos crear una lógica compleja para esto. Podemos usar las funciones integradas `HttpUrl` e `IPv4`.

  1. Genere un número de puerto usando AnyDigit(). El primer dígito del puerto no debe ser cero y los siguientes tres dígitos pueden ser cualquier número.
  2. Use la opción Cualquiera () para agregar lógica múltiple para extraer, ya sea URL HTTP o dirección IP con número de puerto.
from pregex.core.pre import Pregex
from pregex.core.classes import AnyDigit
from pregex.core.operators import Either
from pregex.meta.essentials import HttpUrl, IPv4

port_number = (AnyDigit() - '0') + 3 * AnyDigit()

pre = Either(
    HttpUrl(capture_domain=True, is_extensible=True),
    IPv4(is_extensible=True) + ':' + port_number
)

Usaremos una larga cadena de texto con símbolos y descripciones.

text = """IPV4--192.168.1.1:8000--
        address--https://www.abid.works--
        website--https://kdnuggets.com--text"""

Antes de extraer una cadena coincidente, veamos un ejemplo de RegEx.

regex_pattren = pre.get_pattern()
print(regex_pattren)

Salida

Como podemos ver, es difícil leer o incluso entender lo que está sucediendo. Aquí es donde brilla PREgEx. Proporcionándole una API fácil de usar para realizar tareas complejas de expresiones regulares.

(?:https?:\/\/)?(?:www\.)?(?:[a-z\dA-Z][a-z\-\dA-Z]{,61}[a-z\dA-Z]\.)*([a-z\dA-Z][a-z\-\dA-Z]{,61}[a-z\dA-Z])\.[a-z]{2,6}(?::\d{1,4})?(?:\/[!-.0-~]+)*\/?(?:(?<=[!-\/\[-`{-~:-@])|(?<=\w))|(?:(?:\d|[1-9]\d|1\d{2}|2(?:[0-4]\d|5[0-5]))\.){3}(?:\d|[1-9]\d|1\d{2}|2(?:[0-4]\d|5[0-5])):[1-9]\d{3}

Al igual que `re.match`, usaremos `.get_matches(text)` para recuperar la cadena requerida.

results = pre.get_matches(text)
print(results)

Salida

Extrajimos tanto la dirección IP con el número de puerto como las dos URL web.

['192.168.1.1:8000', 'https://www.abid.works', 'https://kdnuggets.com']

Veamos algunos ejemplos en los que podemos comprender todo el potencial de PREgEx.

En este ejemplo, extraeremos ciertos tipos de patrones de fecha del siguiente texto.

text = """
    04-15-2023
    2023-08-15
    06-20-2023
    06/24/2023
"""

Usando las funciones Exactly() y AnyDigit(), generaremos el día, mes y año de la fecha. El día y el mes tienen dos dígitos y el año tiene 4 dígitos. Están separados por un guión "-".

Después de crear el patrón, ejecutaremos `get_match` para recuperar la cadena coincidente.

from pregex.core.classes import AnyDigit
from pregex.core.quantifiers import Exactly

day_or_month = Exactly(AnyDigit(), 2) 
year = Exactly(AnyDigit(), 4)

pre = (
    day_or_month +
    "-" +
    day_or_month +
    "-" +
    year
)

results = pre.get_matches(text)
print(results)

Salida

['04-15-2023', '06-20-2023']

Veamos un ejemplo RegEx usando la función `get_pattern()`.

regex_pattren = pre.get_pattern()
print(regex_pattren)

Salida

Como podemos ver, tiene una sintaxis RegEx simple.

El segundo ejemplo es un poco más complicado, donde extraeremos direcciones de correo electrónico válidas del texto basura.

text = """
    user1@abid.works
    editorial@@kdnuggets.com
    lover@python.gg.
    editorial1@kdnuggets.com
    """
  • Crear usuario Ejemplo con 'OneOrMore()'. Usaremos “@” de la lógica y “AnyButFrom()” para eliminar el espacio.
  • Similar a un usuario creamos un ejemplo empresa agregar "." de la lógica de ejemplo eliminando el símbolo.
  • Para dominio, usaremos "MatchAtLineEnd()" para iniciar la búsqueda desde el final con dos o más caracteres, excepto "@", espacio y punto.
  • Combine los tres para crear el ejemplo final: usuario@empresa.dominio.
from pregex.core.classes import AnyButFrom
from pregex.core.quantifiers import OneOrMore, AtLeast
from pregex.core.assertions import MatchAtLineEnd

user = OneOrMore(AnyButFrom("@", ' '))
company = OneOrMore(AnyButFrom("@", ' ', '.'))
domain = MatchAtLineEnd(AtLeast(AnyButFrom("@", ' ', '.'), 2))

pre = (
    user +
    "@" +
    company +
    '.' +
    domain
)

results = pre.get_matches(text)
print(results)

Salida

Como podemos ver, PREgEx ha identificado dos direcciones de correo electrónico válidas.

['user1@abid.works', 'editorial1@kdnuggets.com']

Nota: ambos ejemplos de código son versiones modificadas del trabajo PyCoach.

Si es un científico de datos, un analista o un entusiasta de la PNL, debe usar PREgEx para limpiar el texto y generar una lógica simple. Esto reducirá su dependencia de los marcos de NLP, ya que la mayoría de las coincidencias se pueden realizar mediante una API simple.

En este minitutorial, aprendimos sobre el paquete Python PREgEx y sus casos de uso con ejemplos. Puedes obtener más información leyendo la información oficial documentos o resolver un con palabras problema utilizando expresiones regulares programables.

Abid Ali Awan (@1abidaliawan) es un profesional científico de datos certificado al que le encanta crear modelos de aprendizaje automático. Actualmente, se enfoca en la creación de contenido y la redacción de blogs técnicos sobre aprendizaje automático y tecnologías de ciencia de datos. Abid tiene una Maestría en Gestión de Tecnología y una Licenciatura en Ingeniería de Telecomunicaciones. Su visión es crear un producto de inteligencia artificial utilizando una red neuronal gráfica para estudiantes que luchan contra enfermedades mentales.

Leave a Reply

Your email address will not be published. Required fields are marked *