Introducción
Contenido
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:
Te puede interesar:Comparando cadenas usando Pythontext = ""
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:
Te puede interesar:Accediendo a la API de Twitter con Pythontext = "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:
Te puede interesar:Crear y eliminar directorios con Python, '@ ' ? % $ .
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.
Te puede interesar:Introducción a las redes neuronales con Scikit-Learn