Usando Regex para la manipulación de texto en Python

U

Introducción

El preprocesamiento de texto es una de las tareas más importantes en el procesamiento del lenguaje natural (NLP). Por ejemplo, es posible que desee eliminar todos los signos de puntuación de los documentos de texto antes de que puedan utilizarse para la clasificación de texto. Del mismo modo, es posible que desee extraer números de una cadena de texto. Escribir scripts manuales para estas tareas de preprocesamiento requiere mucho esfuerzo y es propenso a errores. Teniendo en cuenta la importancia de estas tareas de preprocesamiento, el Expresiones regulares (también conocido como Regex) se han desarrollado en diferentes idiomas para facilitar estas tareas de preprocesamiento de texto.

Una expresión regular es una cadena de texto que describe un patrón de búsqueda que se puede utilizar para hacer coincidir o reemplazar patrones dentro de una cadena con una cantidad mínima de código. En este tutorial, implementaremos diferentes tipos de expresiones regulares en el lenguaje Python.

Para implementar expresiones regulares, Python re se puede utilizar el paquete. Importar el Python re paquete con el siguiente comando:

import re

Búsqueda de patrones en una cadena

Una de las tareas de PNL más comunes es buscar si una cadena contiene un patrón determinado o no. Por ejemplo, es posible que desee realizar una operación en la cadena según la condición de que la cadena contenga un número.

Para buscar un patrón dentro de una cadena, el match y findall función de la re se utiliza el paquete.

La función de coincidencia

Inicializar una variable text con una cadena de texto de la siguiente manera:

text = "The film Titanic was released in 1998"

Escribamos una expresión regex que coincida con una cadena de cualquier longitud y cualquier carácter:

result = re.match(r".*", text)

El primer parámetro del match función es la expresión regular que desea buscar. La expresión regex comienza con el alfabeto r seguido del patrón que desea buscar. El patrón debe incluirse entre comillas simples o dobles como cualquier otra cadena.

La expresión regular anterior coincidirá con la cadena de texto, ya que estamos tratando de hacer coincidir una cadena de cualquier longitud y cualquier carácter. Si se encuentra una coincidencia, match devuelve la función _sre.SRE_Match objeto como se muestra a continuación:

type(result)

Salida:

_sre.SRE_Match

Ahora para encontrar la cadena coincidente, puede usar el siguiente comando:

result.group(0)

Salida:

'The film Titanic was released in 1998'

En caso de que el match función, una null se devuelve el objeto.

Ahora la expresión regular anterior coincide con una cadena con cualquier longitud y cualquier carácter. También coincidirá con una cadena vacía de longitud cero. Para probar esto, actualice el valor de la variable de texto con una cadena vacía:

text = ""

Ahora, si vuelve a ejecutar la siguiente expresión regular, se encontrará una coincidencia:

result = re.match(r".*", text)

Dado que especificamos hacer coincidir la cadena con cualquier longitud y cualquier carácter, se está haciendo coincidir incluso una cadena vacía.

Para hacer coincidir una cadena con una longitud de al menos 1, se usa la siguiente expresión regular:

result = re.match(r".+", text)

Aquí, el signo más especifica que la cadena debe tener al menos un carácter.

Buscando alfabetos

los match La función se puede utilizar para encontrar cualquier letra del alfabeto dentro de una cadena. Inicialicemos la variable de texto con el siguiente texto:

text = "The film Titanic was released in 1998"

Ahora para encontrar todas las letras del alfabeto, tanto mayúsculas como minúsculas, podemos usar la siguiente expresión regular:

result = re.match(r"[a-zA-z]+", text)

Esta expresión de expresiones regulares indica que coinciden con la cadena de texto para cualquier alfabeto de pequeño a muy pequeño z o capital A a la capital Z. El signo más especifica que la cadena debe tener al menos un carácter. Imprimamos la coincidencia encontrada por la expresión anterior:

print(result.group(0))

Salida:

The

En la salida, puede ver que la primera palabra, es decir, The es regresado. Esto es porque el match La función solo devuelve la primera coincidencia encontrada. En la expresión regular, especificamos que encuentre los patrones con alfabetos pequeños y mayúsculas de a a z. La primera coincidencia encontrada fue The. Después de la palabra The hay un espacio, que no se trata como una letra del alfabeto, por lo tanto, la coincidencia se detuvo y la expresión devolvió solo The, que es el primer partido.

Sin embargo, hay un problema con esto. Si una cadena comienza con un número en lugar de un alfabeto, el match La función devolverá nulo incluso si hay alfabetos después del número. Veamos esto en acción:

text = "1998 was the year when the film titanic was released"
result = re.match(r"[a-zA-z]+", text)
type(result)

Salida:

NoneType

En el script anterior, hemos actualizado la variable de texto y ahora comienza con un dígito. Luego usamos el match función para buscar alfabetos en la cadena. Aunque la cadena de texto contiene alfabetos, se devolverá nulo ya que match La función solo coincide con el primer elemento de la cadena.

Para resolver este problema podemos utilizar el search función.

La función de búsqueda

los search función es similar a la match función, es decir, intenta coincidir con el patrón especificado. Sin embargo, a diferencia del match función, coincide con el patrón globalmente en lugar de coincidir solo con el primer elemento. Por lo tanto, los search La función devolverá una coincidencia incluso si la cadena no contiene un alfabeto al comienzo de la cadena, pero contiene un alfabeto en otra parte de la cadena, como se muestra a continuación:

text = "1998 was the year when the film titanic was released"
result = re.search(r"[a-zA-z]+", text)
print(result.group(0))

Salida:

was

los search la función devuelve “was” ya que esta es la primera coincidencia que se encuentra en la cadena de texto.

Cadena a juego desde el principio

Para verificar si una cadena comienza con una palabra específica, puede usar la tecla zanahoria, es decir ^ seguido de la palabra para que coincida con el search funciona como se muestra a continuación. Supongamos que tenemos la siguiente cadena:

text = "XYZ 1998 was the year when the film titanic was released"

Si queremos saber si la cadena comienza con “1998”, podemos usar el search funcionan de la siguiente manera:

result = re.search(r"^1998", text)
type(result)

En la salida, null se devolverá ya que la cadena de texto no contiene “1998” directamente al principio.

Ahora cambiemos la variable de texto de contenido y agreguemos “1998” al principio y luego verifiquemos si “1998” se encuentra al principio o no. Ejecute el siguiente script:

text = "1998 was the year when the film titanic was released"
if re.search(r"^1998", text):
    print("Match found")
else:
    print("Match not found")

Salida:

Match found

Coincidencia de cadenas desde el final

Para verificar si una cadena termina con una palabra específica o no, podemos usar la palabra en la expresión regular, seguida del signo de dólar. El signo de dólar marca el final del estado de cuenta. Eche un vistazo al siguiente ejemplo:

text = "1998 was the year when the film titanic was released"
if re.search(r"1998$", text):
    print("Match found")
else:
    print("Match not found")

En el script anterior, intentamos encontrar si la cadena de texto termina con “1998”, lo cual no es el caso.

Salida:

Match not found

Ahora, si actualizamos la cadena y agregamos “1998” al final de la cadena de texto, el script anterior devolverá ‘Coincidencia encontrada’ como se muestra a continuación:

text = "was the year when the film titanic was released 1998"
if re.search(r"1998$", text):
    print("Match found")
else:
    print("Match not found")

Salida:

Match found

Sustituir texto en una cadena

Hasta ahora hemos estado usando regex para encontrar si existe un patrón en una cadena. Avancemos con otra función avanzada de expresiones regulares, es decir, sustituyendo texto en una cadena. los sub La función se utiliza para este propósito.

Tomemos un ejemplo simple de la función sustituta. Supongamos que tenemos la siguiente cadena:

text = "The film Pulp Fiction was released in year 1994"

Para reemplazar la cadena “Pulp Fiction” por “Forrest Gump” (otra película lanzada en 1994) podemos usar el sub funcionan de la siguiente manera:

result = re.sub(r"Pulp Fiction", "Forrest Gump", text)

El primer parámetro del sub función es la expresión regular que busca el patrón para sustituir. El segundo parámetro es el texto nuevo que desea como reemplazo del texto anterior y el tercer parámetro es la cadena de texto en la que se realizará la operación de sustitución.

Si imprime la variable de resultado, verá la nueva cadena.

Ahora sustituyamos todos los alfabetos de nuestra cadena con el carácter “X”. Ejecute el siguiente script:

text = "The film Pulp Fiction was released in year 1994"
result = re.sub(r"[a-z]", "X", text)
print(result)

Salida:

TXX XXXX PXXX FXXXXXX XXX XXXXXXXX XX XXXX 1994

Se puede ver en la salida que todos los personajes han sido reemplazados excepto los mayúsculas. Esto se debe a que especificamos a-z solo y no A-Z. Hay dos formas de resolver este problema. Puede especificar A-Z en la expresión regular junto con a-z como sigue:

result = re.sub(r"[a-zA-Z]", "X", text)

O puede pasar el parámetro adicional flags a la subfunción y establezca su valor en re.I que se refiere a mayúsculas y minúsculas, como sigue:

result = re.sub(r"[a-z]", "X", text, flags=re.I)

Se pueden encontrar más detalles sobre los diferentes tipos de banderas en Python regex página de documentación oficial.

Clases de caracteres taquigráficos

Existen diferentes tipos de clases de caracteres abreviados que se pueden utilizar para realizar una variedad de funciones de manipulación de cadenas diferentes sin tener que escribir lógica compleja. En esta sección discutiremos algunos de ellos:

Eliminar dígitos de una cadena

La expresión regular para encontrar dígitos en una cadena es d. Este patrón se puede usar para eliminar dígitos de una cadena reemplazándolos con una cadena vacía de longitud cero como se muestra a continuación:

text = "The film Pulp Fiction was released in year 1994"
result = re.sub(r"d", "", text)
print(result)

Salida:

The film Pulp Fiction was released in year 

Eliminar letras del alfabeto de una cadena

text = "The film Pulp Fiction was released in year 1994"
result = re.sub(r"[a-z]", "", text, flags=re.I)
print(result)

Salida:

1994

Eliminar caracteres de palabras

Si desea eliminar todos los caracteres de la palabra (letras y números) de una cadena y conservar los caracteres restantes, puede utilizar el w patrón en su expresión regular y reemplácelo con una cadena vacía de longitud cero, como se muestra a continuación:

text = "The film, '@Pulp Fiction' was ? released in % $ year 1994."
result = re.sub(r"w","", text, flags = re.I)
print(result)

Salida:

, '@ '  ?   % $  .

El resultado muestra que se han eliminado todos los números y alfabetos.

Eliminar caracteres que no son palabras

Para eliminar todos los caracteres que no son palabras, el W El patrón se puede utilizar de la siguiente manera:

text = "The film, '@Pulp Fiction' was ? released in % $ year 1994."
result = re.sub(r"W", "", text, flags=re.I)
print(result)

Salida:

ThefilmPulpFictionwasreleasedinyear1994

En la salida, puede ver que todo se ha eliminado (incluso los espacios), excepto los números y los alfabetos.

Agrupar varios patrones

Puede agrupar varios patrones para que coincidan o sustituyan en una cadena utilizando el corchete. De hecho, hicimos esto cuando unimos letras mayúsculas y minúsculas. Agrupemos varios signos de puntuación y eliminémoslos de una cadena:

text = "The film, '@Pulp Fiction' was ? released _ in % $ year 1994."
result = re.sub(r"[,@'?.$%_]", "", text, flags=re.I)
print(result)

Salida:

The film Pulp Fiction was  released  in   year 1994

Puede ver que la cadena en la variable de texto tenía varios signos de puntuación, agrupamos todos estos signos de puntuación en la expresión regular usando corchetes. Es importante mencionar que con un punto y una comilla simple tenemos que usar la secuencia de escape, es decir, una barra inclinada hacia atrás. Esto se debe a que, por defecto, el operador de punto se usa para cualquier carácter y las comillas simples se usan para denotar una cadena.

Eliminar varios espacios

A veces, aparecen varios espacios entre palabras como resultado de la eliminación de palabras o puntuación. Por ejemplo, en la salida del último ejemplo, hay varios espacios entre in y year. Estos espacios se pueden eliminar utilizando el s patrón, que se refiere a un solo espacio.

text = "The film      Pulp Fiction      was released in   year 1994."
result = re.sub(r"s+"," ", text, flags = re.I)
print(result)

Salida:

The film Pulp Fiction was released in year 1994.

En el script anterior usamos la expresión s+ que se refiere a espacios únicos o múltiples.

Eliminar espacios desde el principio y el final

A veces tenemos una oración que comienza o termina con un espacio, lo que a menudo no es deseable. La siguiente secuencia de comandos elimina los espacios del comienzo de una oración:

text = "         The film Pulp Fiction was released in year 1994"
result = re.sub(r"^s+", "", text)
print(result)

Salida:

The film Pulp Fiction was released in year 1994

De manera similar, para eliminar el espacio al final de la cadena, se puede utilizar el siguiente script:

text = "The film Pulp Fiction was released in year 1994      "
result = re.sub(r"s+$", "", text)
print(result)

Eliminar un solo carácter

A veces, la eliminación de los signos de puntuación, como un apóstrofe, da como resultado un solo carácter que no tiene significado. Por ejemplo, si quita el apóstrofe de la palabra Jacob's y reemplazarlo con espacio, la cadena resultante es Jacob s. Aquí el s no tiene sentido. Estos caracteres individuales se pueden eliminar usando expresiones regulares como se muestra a continuación:

text = "The film Pulp Fiction     s was b released in year 1994"
result = re.sub(r"s+[a-zA-Z]s+", " ", text)
print(result)

Salida:

The film Pulp Fiction was released in year 1994

El guión reemplaza cualquier letra minúscula o mayúscula entre uno o más espacios, con un solo espacio.

División de una String

La división de cadenas es otra función muy importante. Las cadenas se pueden dividir usando split función del paquete re. los split La función devuelve una lista de tokens divididos. Dividamos una cadena de palabras donde se encuentran uno o más caracteres de espacio, como se muestra a continuación:

text = "The film      Pulp   Fiction was released in year 1994      "
result = re.split(r"s+", text)
print(result)

Salida:

['The', 'film', 'Pulp', 'Fiction', 'was', 'released', 'in', 'year', '1994', '']

De manera similar, puede usar otras expresiones regex para dividir una cadena usando el split funciones. Por ejemplo, lo siguiente split La función divide una cadena de palabras cuando se encuentra una coma:

text = "The film, Pulp Fiction, was released in year 1994"
result = re.split(r",", text)
print(result)

Salida:

['The film', ' Pulp Fiction', ' was released in year 1994']

Encontrar todas las instancias

los match La función realiza una coincidencia en el primer elemento mientras que search La función realiza una búsqueda global en la cadena y devuelve la primera instancia coincidente.

Por ejemplo, si tenemos la siguiente cadena:

text = "I want to buy a mobile between 200 and 400 euros"

Queremos buscar todos los dígitos de esta cadena. Si usamos el search función, solo se devolverá la primera aparición de dígitos, es decir, 200 como se muestra a continuación:

result = re.search(r"d+", text)
print(result.group(0))

Salida:

200

Por otro lado, el findall La función devuelve una lista que contiene todas las expresiones coincidentes como se muestra a continuación:

text = "I want to buy a mobile between 200 and 400 euros"
result = re.findall(r"d+", text)
print(result)

Salida:

['200', '400']

Puede ver en el resultado que tanto “200” como “400” son devueltos por findall función.

Conclusión

En este artículo, estudiamos algunas de las funciones de expresiones regulares más utilizadas en Python. Las expresiones regulares son extremadamente útiles para preprocesar texto que se puede utilizar más para una variedad de aplicaciones, como modelado de temas, clasificación de texto, análisis sentimentaly resumen de textoetc.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad