¿Hay una lista o biblioteca que tenga todos los signos de puntuación con los que nos podemos encontrar comúnmente?
Normalmente uso string.punctuation , pero algunos caracteres de puntuación no están incluidos, por ejemplo:
>>> "'" in string.punctuation True >>> "'" in string.punctuation FalseComo han señalado otras respuestas, la forma de hacerlo es a través de las propiedades/categorías de Unicode. La respuesta aceptada accede a esta información a través del módulo unicodedata de la biblioteca estándar, pero según el contexto en el que lo necesite, podría ser más rápido o más conveniente acceder a esta misma información de propiedad mediante expresiones regulares.
Sin embargo, el re de biblioteca estándar no proporciona soporte Unicode extendido. Para eso, necesita el módulo regex , disponible en PyPI ( pip install regex ):
>>> import regex as re >>> re.match("\p{Punctuation}", "'") <regex.Match object; span=(0, 1), match="'"> >>> re.match("\p{Punctuation}", "'") <regex.Match object; span=(0, 1), match='''> Aquí se proporciona una buena descripción general de todos los diferentes tipos de propiedades Unicode que puede buscar mediante expresiones regulares. Además de estas funciones adicionales de expresión regular, que están documentadas en su página de inicio de PyPI, regex proporciona deliberadamente la misma API que re , por lo que se espera que use la documentación de re para descubrir cómo usar cualquiera de ellas.
Puede que te vaya mejor con esta comprobación:
>>> import unicodedata >>> unicodedata.category("'").startswith("P") True >>> unicodedata.category("'").startswith("P") TrueLas categorías Unicode P* son específicamente para puntuación :
conector (Pc), guión (Pd), comilla inicial (Pi), comilla final (Pf), abrir (Ps), cerrar (Pe), otro (Po)
Para preparar la colección exhaustiva, que luego puede usar para verificaciones rápidas de membresía, use una comprensión establecida:
>>> import sys >>> from unicodedata import category >>> codepoints = range(sys.maxunicode + 1) >>> punctuation = {c for i in codepoints if category(c := chr(i)).startswith("P")} >>> "'" in punctuation True >>> "'" in punctuation TrueLa expresión de asignación aquí requiere Python 3.8+, equivalente para versiones anteriores de Python:
chrs = (chr(i) for i in range(sys.maxunicode + 1)) punctuation = set(c for c in chrs if category(c).startswith("P")) Tenga en cuenta que algunos de los otros caracteres en string.punctuation están en realidad en la categoría Símbolo Unicode. Es fácil agregarlos también si lo desea.
La respuesta publicada por wim es correcta si desea verificar si un carácter es un carácter de puntuación.
Si realmente necesita una lista de todos los caracteres de puntuación como sugiere el título de su pregunta, puede usar lo siguiente:
import sys from unicodedata import category punctuation_chars = [chr(i) for i in range(sys.maxunicode) if category(chr(i)).startswith("P")]La respuesta de wim es excelente si puede cambiar su código para usar una función.
Pero si tiene que usar el operador in (por ejemplo, está llamando al código de la biblioteca), puede usar la escritura pato:
import unicodedata class DuckType: def __contains__(self,s): return unicodedata.category(s).startswith("P") punct=DuckType() #print("'" in punct,'"' in punct,"a" in punct)Eso parece un buen trabajo para una expresión regular (regexp):
import re text = re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) Aquí, la expresión regular coincide con todo, excepto con espacios en blanco o caracteres de palabras. El indicador re.UNICODE se utiliza para hacer coincidir el conjunto completo de caracteres Unicode.