Parece que debería haber una forma más simple que:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
¿Esta ahí?
python
string
punctuation
Lawrence Johnston
fuente
fuente
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" contiene exactamente UN carácter de puntuación, el segundo "."string.punctuation
no incluye puntuación en inglés. Estoy pensando en。 ,!? : × “” 〟, y así sucesivamente.Respuestas:
Desde una perspectiva de eficiencia, no vas a vencer
Para versiones superiores de Python use el siguiente código:
Realiza operaciones de cadena sin formato en C con una tabla de búsqueda: no hay mucho que supere eso, sino escribir su propio código C.
Si la velocidad no es una preocupación, otra opción es:
Esto es más rápido que reemplazarlo con cada carácter, pero no funcionará tan bien como los enfoques de Python no puros como regexes o string.translate, como puede ver en los tiempos a continuación. Para este tipo de problema, vale la pena hacerlo al nivel más bajo posible.
Código de tiempo:
Esto da los siguientes resultados:
fuente
table = string.maketrans("","")
debería reemplazarse contable = str.maketrans({key: None for key in string.punctuation})
?regex
es ahora el método más eficiente! Es casi 2 veces más rápido que traducir. Además, ¡los juegos y el reemplazo ya no son tan malos! Ambos están mejorados por más de un factor de 4 :)Las expresiones regulares son lo suficientemente simples, si las conoce.
fuente
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Al probarlo con Python 3 en Linux, funciona incluso sin la bandera con letras tamil, தமிழ்.Para la conveniencia del uso, resumo la nota de puntuación de rayas de una cadena tanto en Python 2 como en Python 3. Consulte otras respuestas para obtener una descripción detallada.
Python 2
Python 3
fuente
fuente
str
en cuenta que para Python 3 yunicode
Python 2, eldeletechars
argumento no es compatible.TypeError: translate() takes exactly one argument (2 given)
:(Usualmente uso algo como esto:
fuente
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
es solo ASCII ! Una forma más correcta (pero también mucho más lenta) es usar el módulo unicodedata:También puede generalizar y eliminar otros tipos de caracteres:
También eliminará caracteres como los
~*+§$
que pueden o no ser "puntuación" dependiendo del punto de vista de cada uno.fuente
regex.sub(ur"\p{P}+", "", text)
~
no son parte de la categoría de puntuación. También debe probar la categoría Símbolos.No necesariamente más simple, pero de una manera diferente, si está más familiarizado con la familia re.
fuente
Para los valores de Python 3
str
o Python 2unicode
,str.translate()
solo toma un diccionario; los puntos de código (enteros) se buscan en esa asignación yNone
se elimina todo lo asignado .Para eliminar (¿alguna?) Puntuación, entonces use:
El
dict.fromkeys()
método de clase hace que sea trivial crear la asignación, estableciendo todos los valores enNone
función de la secuencia de claves.Para eliminar toda la puntuación, no solo la puntuación ASCII, su tabla debe ser un poco más grande; ver la respuesta de JF Sebastian (versión Python 3):
fuente
string.punctuation
no es suficiente. Ver mi respuestaunicode
objetos frente a los objetos de Python 2str
.string.punctuation
pierde montones de signos de puntuación que se usan comúnmente en el mundo real. ¿Qué tal una solución que funciona para la puntuación no ASCII?Personalmente, creo que esta es la mejor manera de eliminar la puntuación de una cadena en Python porque:
\{S}
si desea eliminar la puntuación, pero mantener símbolos como$
.\{Pd}
, solo eliminará guiones.Utiliza las propiedades de caracteres Unicode, sobre las que puede leer más en Wikipedia .
fuente
No he visto esta respuesta todavía. Solo usa una expresión regular; elimina todos los caracteres además de los caracteres de palabra (
\w
) y los caracteres de número (\d
), seguido de un carácter de espacio en blanco (\s
):fuente
\d
es redundante ya que es un subconjunto de\w
.\w
en la documentación: docs.python.org/3/library/re.htmlAquí hay una línea para Python 3.5:
fuente
Esta podría no ser la mejor solución, sin embargo, así es como lo hice.
fuente
Aquí hay una función que escribí. No es muy eficiente, pero es simple y puede agregar o eliminar cualquier puntuación que desee:
fuente
fuente
Solo como una actualización, reescribí el ejemplo de @Brian en Python 3 e hice cambios para mover el paso de compilación de expresiones regulares dentro de la función. Mi pensamiento aquí era cronometrar cada paso necesario para que la función funcionara. Tal vez está utilizando la informática distribuida y no puede tener un objeto regex compartido entre sus trabajadores y necesita tener un
re.compile
paso en cada trabajador. Además, tenía curiosidad por cronometrar dos implementaciones diferentes de maketrans para Python 3vs
Además, agregué otro método para usar set, donde aprovecho la función de intersección para reducir el número de iteraciones.
Este es el código completo:
Estos son mis resultados:
fuente
fuente
Aquí hay una solución sin expresiones regulares.
fuente
Una frase podría ser útil en casos no muy estrictos:
fuente
fuente
fuente
¿Por qué ninguno de ustedes usa esto?
¿Demasiado lento?
fuente
Considerando unicode. Código verificado en python3.
fuente
Eliminar palabras de detención del archivo de texto usando Python
fuente
Me gusta usar una función como esta:
fuente
abc.strip(string.punctuation)
en su lugar para eso. No eliminará tales caracteres en el medio .