Análisis sintáctico de cadenas en Python para principiantes y expertos

Python ofrece varias formas de trabajar con cadenas. En esta entrada de blog, primero presentaremos los fundamentos del análisis sintáctico de cadenas en Python y aclararemos la diferencia entre indexación de cadenas y secuencia de cadenas.

Indexación de cadenas

En Python, un Cadena una secuencia de caracteres. Se puede acceder a estos caracteres mediante un índice, que se utiliza para 0 comienza. Permite acceder al primer, segundo y tercer carácter de una cadena:

text = "Python"
print(text[0]) # Salida 'P'.
print(text[1]) # Salida 'y'.
print(text[2]) # Salida 't'.

También puede utilizar índices negativos para acceder a los caracteres desde el final de la cadena:

print(text[-1]) # Salida 'n'.
print(text[-2]) # Salida 'o'.
print(text[-3]) # Salida 'h

Secuencia de cadenas

Una secuencia de cadenas es una parte de una cadena que se especifica mediante un índice inicial y final. En Python, puedes utilizar la llamada sintaxis de corte para acceder a partes de una cadena:

pythonCopiar códigotext = "Python"
print(text[0:3]) # Imprime 'Pyt'.
print(text[1:4]) # Imprime 'yth'.
print(text[:2]) # Imprime 'Py' (sin índice inicial corresponde al índice 0)
print(text[3:]) # Imprime 'hon' (sin índice final corresponde a índice + 1)

La sintaxis de corte también funciona con índices negativos:

print(text[-3:-1]) # Salida 'ho'.
print(text[:-2]) # Escribe 'Pyth'.

Para resumir las diferencias entre indexación de cadenas y secuencia de cadenas: La indexación de cadenas se refiere al acceso a un único carácter de una cadena, mientras que la secuencia de cadenas se refiere al acceso a parte de la cadena.

Un caso de uso del método split en Python: números de versión y hashes de commit

En muchas situaciones, como cuando trabajamos con proyectos de software, a menudo necesitamos extraer información de cadenas combinadas. Tomemos como ejemplo una cadena que contiene un número de versión y un hash de confirmación: "2.7.0_bf4fda703454". Para separar esta información, podemos utilizar la función dividir()-en Python.

version_hash = "2.7.0_bf4fda703454"
version_hash_list = version_hash.split("_")

El resultado es una lista de cadenas con el siguiente aspecto:

['2.7.0', 'bf4fda703454']

Aquí la cadena se separa en cada guión bajo. Si desea que la separación se produzca sólo después del primer guión bajo, puede utilizar el método dividir() con el parámetro opcional 1 uso:

version_hash.split("_", 1)

Si está seguro de que la cadena contiene un guión bajo, puede incluso descomprimir las partes izquierda y derecha en variables separadas:

lhs, rhs = version_hash.split("_", 1)
print(lhs) # Salida '2.7.0'.
print(rhs) # Salida 'bf4fda703454'.

Una alternativa a la dividir()-método es el uso de partición(). El uso es similar al del ejemplo anterior, salvo que aquí se devuelven tres componentes en lugar de dos. La principal ventaja de este método es que no falla si la cadena no contiene el separador.

En general, el dividir()-es una forma práctica de dividir y procesar información combinada en Python. En nuestro ejemplo, podríamos separar fácilmente el número de versión y el hash de confirmación.

Análisis sintáctico de cadenas con expresiones regulares - Regex

Descomponga texto con grupos regex con nombre en Python y sopese las ventajas y desventajas frente a funciones convencionales como la indexación de cadenas en Python, la secuenciación o el método de división.

Cuando tenemos cadenas complejas que necesitan descomponerse debido a patrones o a una puntuación difícil, las expresiones regulares pueden ayudar a reconocer y descomponer estos patrones.

A continuación se muestra un ejemplo de código para el análisis sintáctico de cadenas con grupos regex con nombre en Python:

importar re
# Texto de ejemplo
text = "Max Mustermann, Edad: 30, Ciudad: Berlín".
# Expresión regular con grupos de nombres
texto_patrón = r'(?P[A-Za-zäöüÄÖß\s]+),\s+edad:\s+(?P\d+)\s+años,\s+ciudad:\s+(?P[A-Za-zäöüÄÖß\s]+)''
# Compila la expresión regular
patrón = re.compile(texto_patrón)
# Buscar coincidencias en el texto
match = pattern.match(texto)
# Comprueba si se ha encontrado una coincidencia
si coincide:
    # Extraer los grupos con nombre.
    nombre = match.group('nombre')
    edad = match.group('edad')
    ciudad = match.group('ciudad')
    # Imprimir la información extraída
    print(f "Nombre: {nombre}")
    print(f "Edad: {edad}")
    print(f "ciudad: {ciudad}")
si no:
    print("No se ha encontrado ninguna coincidencia.")

En este ejemplo, tenemos un texto de ejemplo con el nombre, la edad y la ciudad de una persona. Utilizamos una expresión regular con grupos nombrados para extraer la información relevante del texto. Los grupos se denominan como sigue

  • nombre: para el nombre de la persona
  • edad: para la edad de la persona
  • ciudad: para la ciudad en la que vive la persona

Una vez compilada la expresión regular, buscamos coincidencias en el texto. Si se encuentra una coincidencia, se extraen los grupos nombrados y se emite la información extraída.

Ventajas:

  1. Flexibilidad: las expresiones regulares ofrecen un alto grado de flexibilidad en el análisis de textos y pueden reconocer patrones complejos.
  2. Compactas: las expresiones regulares suelen ser más breves y concisas que los métodos convencionales.
  3. Grupos con nombre: Con los grupos nombrados podemos identificar y extraer fácilmente partes del patrón.

Desventajas:

  1. Curva de aprendizaje: Las expresiones regulares tienen una curva de aprendizaje más pronunciada y suelen ser más difíciles de leer y comprender que los métodos tradicionales.
  2. Aplicabilidad limitada: las expresiones regulares no son adecuadas para documentos anidados en profundidad, como HTML, XML o JSON.

Método de indexación, secuenciación o división de cadenas de Python: Las funciones tradicionales como el método de indexación, secuenciación o división de cadenas de Python son muy adecuadas para tareas sencillas de análisis de texto en las que la estructura de la cadena es clara y simple.

Ventajas:

  1. Simplicidad: los métodos tradicionales son fáciles de entender y aplicar.
  2. Legibilidad: El código es más fácil de leer y comprender para los desarrolladores familiarizados con Python.

Desventajas:

  1. Flexibilidad limitada: estos métodos ofrecen menos flexibilidad a la hora de analizar patrones textuales complejos.
  2. Código más largo: El código puede hacerse más largo y confuso al intentar identificar y descomponer patrones complejos.

Automatizar Regex en Python

En este ejemplo mostramos cómo utilizar el SDK de Konfuzio para automatizar la creación de regex. Utilizamos el SDK para crear un tokenizador regex personalizado para la etiqueta "FechaContrato" para crear. Encontrará más información en documentación técnica y en un más artículos del blog encontrar.

from konfuzio_sdk.data import Proyecto
from konfuzio_sdk.tokenizer.regex import RegexTokenizer
from konfuzio_sdk.tokenizer.base import ListTokenizer
# Sustituye YOUR_PROJECT_ID y YOUR_CATEGORY_ID por los ID correspondientes de tu proyecto y categoría.
mi_proyecto = Proyecto(id_=TU_ID_PROYECTO)
category = mi_proyecto.get_categoría_por_id(id_=ID_TU_CATEGORÍA_)
tokenizer = ListTokenizer(tokenizers=[])
label = mi_proyecto.get_label_por_nombre("Fecha_contrato")
# Buscar expresiones regex asociadas a apariciones de la etiqueta "FechaContrato" coincidir
for regex in label.find_regex(category=category):
    regex_tokenizer = RegexTokenizer(regex=regex)
    tokenizer.tokenizers.append(regex_tokenizer)
# Utiliza el tokenizador regex creado para crear anotaciones para cada cadena coincidente en un documento.
# Sustituye YOUR_DOCUMENT_ID por el ID correspondiente de tu documento.
documento = mi_proyecto.get_documento_por_id(YOUR_DOCUMENT_ID)
tokenizer.tokenize(documento)

En este fragmento de código:

  1. Vamos a importar las clases y funciones necesarias del SDK Konfuzio.
  2. Vamos a crear un Proyecto-objeto especificando el ID del proyecto.
  3. ¿Conseguimos un Categoría-objeto especificando el ID de la categoría.
  4. Vamos a crear un ListTokenizer.
  5. ¿Conseguimos el Etiqueta-objeto para la etiqueta "FechaContrato„.
  6. Busquemos expresiones regex que empiecen con apariciones de la etiqueta "FechaContrato" en la categoría de datos de formación.
  7. Añadamos cada expresión regex encontrada como un RegexTokenizer el ListTokenizer añadido.
  8. Utilicemos el tokenizador regex creado para crear anotaciones para cada cadena coincidente en un documento. Para ello, especificamos el ID del documento y llamamos a la función tokenizar()-del tokenizador.

Una vez creado el tokenizador, puede utilizarlo para generar automáticamente expresiones regex para la etiqueta "FechaContrato" en tus documentos y crear anotaciones para ellos.

"
"
Avatar de Florian Zyprian

Últimos artículos