Expresión regular de Python, elimine todos los signos de puntuación excepto el guión de la cadena Unicode

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)