Usando Regex para la manipulaci贸n de texto en Python

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *