Coincidencia de cadenas de Python sin sintaxis RegEx compleja

Coincidencia de cadenas de Python sin sintaxis RegEx compleja

Nodo de origen: 1935271

Coincidencia de cadenas de Python sin sintaxis RegEx compleja
Imagen del autor
 

Tengo una relación de amor y odio con las expresiones regulares (RegEx), especialmente en Python. Me encanta cómo puedes extraer o hacer coincidir cadenas sin escribir varias funciones lógicas. Es incluso 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 lidiar con coincidencias de cadenas simples, como extraer todos los caracteres alfanuméricos y limpiar el texto para tareas de NLP. Las cosas se vuelven más difíciles cuando se trata de extraer direcciones IP, correos electrónicos e identificaciones de texto no deseado. 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 pregexo. Además, también veremos algunos 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 un RegEx sin patrones RegEx complejos que facilitan que cualquier programador entienda y recuerde expresiones regulares. Además, no tiene que agrupar patrones o escapar metacaracteres, y es modular. 

Simplemente puede instalar la biblioteca usando PIP.

pip install pregex

 

Para probar la poderosa funcionalidad de PRegEx, usaremos un código de muestra modificado del documentación

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

  1. Cree 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. Utilice la opción "Other()" para agregar varias lógicas para extraer, ya sea una URL HTTP o una dirección IP con un 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 caracteres y descripciones. 

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

 

Antes de extraer la cadena coincidente, veamos el patrón RegEx. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Salida

Como podemos ver, es difícil leer o incluso entender lo que está pasando. Aquí es donde brilla PRegEx. Para proporcionarle una API amigable para los humanos para realizar tareas complejas de expresiones regulares. 

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

 

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

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

 

Salida

Hemos extraído tanto la dirección IP con el número de puerto como dos URL web. 

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

Veamos un par de ejemplos en los que podemos comprender todo el potencial de PRegEx. 

En este ejemplo, extraeremos ciertos tipos de patrones de fecha del texto a continuación.

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

 

Usando Exactly() y AnyDigit(), crearemos el día, mes y año de la fecha. El día y el mes tienen dos dígitos, mientras que el año tiene 4 dígitos. Están separados por guiones "-".

Después de crear el patrón, ejecutaremos `get_match` para extraer 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 el patrón RegEx usando la función `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Salida

Como podemos ver, tiene una sintaxis RegEx simple. 

d{2}-d{2}-d{4}

El segundo ejemplo es un poco complejo, 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 """

 

  • Créar un usuario patrón con `OneOrMore()`. Usaremos `AnyButFrom()` para eliminar "@" y el espacio de la lógica. 
  • Similar a una usuario patrón creamos un compañía patrón eliminando el carácter adicional “.” de la lógica.
  • Para el dominio,  Usaremos `MatchAtLineEnd()` para comenzar la búsqueda desde el final con dos o más caracteres, excepto "@", espacio y punto final.  
  • Combina los tres para crear el patrón 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 de El PyCoach

Si es científico de datos, analista o entusiasta de la PNL, debe usar PRegEx para limpiar el texto y crear una lógica simple. 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 mini tutorial, hemos aprendido sobre el paquete Python PRegEx y sus casos de uso con ejemplos. Puedes aprender más leyendo el oficial documentación o resolviendo un una línea de 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 está enfocando en la creación de contenido y escribiendo 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 construir un producto de IA utilizando una red neuronal gráfica para estudiantes que luchan contra enfermedades mentales.
 

Sello de tiempo:

Mas de nuggets