Есть ли список или библиотека, в которой есть все знаки препинания, с которыми мы обычно сталкиваемся?
Обычно я использую string.punctuation
, но некоторые знаки препинания не включены в него, например:
>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False
Ответы:
Вы могли бы сделать лучше с этой проверкой:
Unicode категории P * специально для пунктуации :
соединитель (Pc), тире (Pd), начальная кавычка (Pi), окончательная кавычка (Pf), открытый (Ps), закрытый (Pe), другой (Po)
Чтобы подготовить исчерпывающую коллекцию, которую вы впоследствии сможете использовать для быстрой проверки членства, используйте набор пониманий:
Выражение присваивания здесь требует Python 3.8+, эквивалент для более старых версий Python:
Помните, что некоторые другие символы в
string.punctuation
действительности находятся в категории символов Unicode . Это легко добавить, если вы хотите.источник
$
), Sk (модификатор, как^
), Sm (математика, как+
или<
) и, возможно, So (другое, как©
).Ответ от wim верен, если вы хотите проверить, является ли символ знаком пунктуации.
Если вам действительно нужен список всех знаков препинания, как подсказывает заголовок вашего вопроса, вы можете использовать следующее:
источник
Ответ от wim хорош, если вы можете изменить свой код для использования функции.
Но если вам нужно использовать
in
оператор (например, вы вызываете код библиотеки), вы можете использовать утку:источник
Это выглядит как хорошая работа для регулярного выражения (регулярное выражение):
Здесь регулярное выражение соответствует всем, кроме пробелов или символов слова. Флаг
re.UNICODE
используется для сопоставления с полным набором символов Юникода.источник
>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
\xc3
побег - это репрезентация, не связанная со снятием знаков препинания).\xc3
не является правильной кодировкой Unicodeæ
; если вы напечатаете,str(text)
вы можете подтвердить, что это так\xc3\xa6
. На самом деле\xc3
, похоже, не полная кодовая точка.str
есть строка байтов. Вам определенно следует переключиться на Python 3, потому что Unicode - это кошмар в Py2. Для меняstr('æ')
показывает как'æ'
, иascii('æ')
показывает как'\xe6'
, что является правильной кодовой точкой.b'\xc3\xa6'
кодировка UTF-8'æ'
, но обычно это не то, с чем вы хотите работать.Как указывалось в других ответах, способ сделать это - через свойства / категории Unicode. Принятый ответ обращается к этой информации через стандартный библиотечный
unicodedata
модуль, но в зависимости от контекста, где это необходимо, может быть быстрее или удобнее получить доступ к этой же информации о свойствах с помощью регулярных выражений.Однако стандартный
re
модуль библиотеки не обеспечивает расширенной поддержки Unicode. Для этого вам нуженregex
модуль , доступный в PyPI (pip install regex
):Хороший обзор всех различных типов свойств Unicode, которые вы можете искать с помощью регулярных выражений, представлен здесь . Помимо этих дополнительных функций регулярных выражений, которые задокументированы на его домашней странице PyPI,
regex
намеренно предоставляет тот же APIre
, что и вы, вероятно, будете использоватьre
документацию, чтобы выяснить, как использовать любой из них.источник