es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Expresión regular de Python: coincidir solo el punto, no la letra antes de él.

Tengo un patrón de regex de la siguiente manera:

r'(?:(?<!\.|\s)[a-z]\.|(?<!\.|\s)[A-Z]\.)+'

y estoy tratando de modificarlo para que solo coincida con el punto al final de las oraciones y no con la letra anterior. Aquí está mi cadena:

sent = 'This is the U.A. we have r.a.d. golden 13.56 date. a better date 34. was there.'

y esto es lo que he hecho:

import re
re.split(r'(?:(?<!\.|\s)[a-z]\.|(?<!\.|\s)[A-Z]\.)+', sent)

sin embargo, lo que sucede es que elimina la última letra de las palabras:

Resultado actual:

['This is the U.A. we have r.a.d. golden 13.56 dat', ' a better date 34. was ther', '']

Mi resultado deseado es:

['This is the U.A. we have r.a.d. golden 13.56 date', ' a better date 34. was there', '']

No sé cómo puedo modificar el patrón para mantener la última letra de las palabras ‘date’ y ‘there’.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para modificar el patrón de la expresión regular para que solo coincida con el punto al final de las oraciones y no con la letra antes de ellos, puedes usar el siguiente patrón:

    r'(?:(?<!\.)\b[a-z]\.|(?<!\.)\b[A-Z]\.)+\B'
    

    En este patrón, \b coincide con un límite de palabra y \B coincide con un límite de palabra no válido. Esto asegura que se coincida con el punto al final de la oración, pero no con el punto antes de una letra en medio de la palabra.

    Aquí está el código modificado utilizando el nuevo patrón:

    import re
    sent = 'This is the U.A. we have r.a.d. golden 13.56 date. a better date 34. was there.'
    re.split(r'(?:(?<!\.)\b[a-z]\.|(?<!\.)\b[A-Z]\.)+\B', sent)
    

    La salida será la siguiente:

    ['This is the U.A. we have r.a.d. golden 13.56 date', ' a better date 34. was there', '']
    

Comments are closed.