Tengo este código para eliminar toda la puntuación de una cadena de expresiones regulares:
import regex as re re.sub(ur"\p{P}+", "", txt)
¿Cómo lo cambiaría para permitir guiones? Si pudieras explicar cómo lo hiciste, sería genial. Entiendo que aquí, corrígeme si me equivoco, P con cualquier cosa después de que sea puntuacion.
[^\P{P}-]+
\P
es el complemento de \p
– no puntuación. Por lo tanto, esto coincide con cualquier cosa que no sea (ni la puntuación ni un guión), lo que da como resultado toda puntuación, excepto los guiones.
Ejemplo: http://www.rubular.com/r/JsdNM3nFJ3
Si desea una forma no complicada, una alternativa es \p{P}(? : haga coincidir todos los signos de puntuación, y luego verifique que no fue un guión (usando la apariencia negativa detrás).
Ejemplo de trabajo: http://www.rubular.com/r/5G62iSYTdk
Aquí le indicamos cómo hacerlo con el módulo re
, en caso de que tenga que atenerse a las bibliotecas estándar:
# works in python 2 and 3 import re import string remove = string.punctuation remove = remove.replace("-", "") # don't remove hyphens pattern = r"[{}]".format(remove) # create the pattern txt = ")*^%{}[]thi's - is - @@#!a !%%!!%- test." re.sub(pattern, "", txt) # >>> 'this - is - a - test'
Si el rendimiento es importante, es posible que desee utilizar str.translate
, ya que es más rápido que usar una expresión regular . En Python 3, el código es txt.translate({ord(char): None for char in remove})
.
Puede especificar la puntuación que desea eliminar manualmente, como en [._,]
o proporcionar una función en lugar de la cadena de reemplazo:
re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else "", text)