Кажется, что должен быть более простой способ, чем:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Есть?
python
string
punctuation
Лоуренс Джонстон
источник
источник
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" содержит ровно один знак пунктуации, второй "."string.punctuation
вообще не включает неанглийскую пунктуацию. Я думаю о。 ,!? : × «» and и так далее.Ответы:
С точки зрения эффективности, вы не будете бить
Для более поздних версий Python используйте следующий код:
Он выполняет необработанные строковые операции в C с помощью таблицы поиска - не так много, что может побить это, кроме написания собственного кода на C.
Если скорость не беспокоит, другой вариант:
Это быстрее, чем s.replace с каждым символом, но не будет работать так же, как и не чистые подходы Python, такие как регулярные выражения или string.translate, как вы можете видеть из приведенного ниже времени. Для такого типа проблем окупаемость на минимально возможном уровне.
Сроки код:
Это дает следующие результаты:
источник
table = string.maketrans("","")
следует заменить наtable = str.maketrans({key: None for key in string.punctuation})
?regex
теперь является наиболее эффективным методом! Это почти в 2 раза быстрее, чем перевод. Кроме того, наборы и замена больше не так уж плохи! Они оба улучшены более чем в 4 раза :)Регулярные выражения достаточно просты, если вы их знаете.
источник
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Тестируя его с python 3 на linux, он работает даже без флага, использующего тамильские буквы, தமிழ்.Для удобства использования я суммирую примечание о чередовании знаков препинания в строке как в Python 2, так и в Python 3. Пожалуйста, обратитесь к другим ответам для подробного описания.
Python 2
Python 3
источник
источник
str
в Python 3 иunicode
в Python 2deletechars
аргумент не поддерживается.TypeError: translate() takes exactly one argument (2 given)
:(Я обычно использую что-то вроде этого:
источник
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
только ASCII ! Более правильным (но также и гораздо более медленным) способом является использование модуля unicodedata:Вы можете обобщать и обрезать символы других типов:
Он также удалит такие символы,
~*+§$
которые могут быть или не быть пунктуацией в зависимости от вашей точки зрения.источник
regex.sub(ur"\p{P}+", "", text)
~
не входят в категорию знаков препинания. Вам также необходимо проверить категорию «Символы».Не обязательно проще, но по-другому, если вы больше знакомы с семьей.
источник
Для значений Python 3
str
или Python 2 требуется только словарь; кодовые точки (целые числа) ищутся в этом отображении, и все сопоставленное удаляется.unicode
str.translate()
None
Чтобы удалить (некоторые?) Знаки препинания, используйте:
Метод
dict.fromkeys()
класса упрощает создание сопоставления, устанавливая все значения наNone
основе последовательности ключей.Чтобы удалить все знаки препинания, а не только знаки препинания ASCII, ваш стол должен быть немного больше; см . ответ Дж.Ф. Себастьяна (версия Python 3):
источник
string.punctuation
недостаточно. Смотрите мой ответunicode
объектов против объектов Python 2str
.string.punctuation
пропускает множество знаков препинания, которые обычно используются в реальном мире. Как насчет решения, которое работает для пунктуации без ASCII?Лично я считаю, что это лучший способ удалить пунктуацию из строки в Python, потому что:
\{S}
удалить пунктуацию, если вы хотите удалить знаки препинания, но оставить символы как$
.\{Pd}
, удалит только тире.При этом используются свойства символов Unicode, о которых вы можете прочитать подробнее в Википедии .
источник
Я еще не видел этот ответ. Просто используйте регулярное выражение; он удаляет все символы, кроме слов символов (
\w
) и чисел (\d
), за которыми следует символ пробела (\s
):источник
\d
является избыточным, так как это подмножество\w
.\w
в документации: docs.python.org/3/library/re.htmlВот одна строка для Python 3.5:
источник
Возможно, это не лучшее решение, но я так и сделал.
источник
Вот функция, которую я написал. Это не очень эффективно, но это просто, и вы можете добавить или удалить любую пунктуацию по вашему желанию:
источник
источник
В качестве обновления я переписал пример @Brian в Python 3 и внес в него изменения, чтобы переместить шаг компиляции regex внутри функции. Я думал здесь о том, чтобы рассчитывать каждый шаг, необходимый для работы функции. Возможно, вы используете распределенные вычисления и не можете разделить объект regex между вашими работниками, и вам нужно иметь
re.compile
шаг к каждому работнику. Кроме того, мне было любопытно провести время двух разных реализаций макетранса для Python 3против
Кроме того, я добавил другой метод для использования set, в котором я использую функцию пересечения, чтобы уменьшить количество итераций.
Это полный код:
Это мои результаты:
источник
источник
Вот решение без регулярных выражений.
источник
Однострочник может быть полезен в не очень строгих случаях:
источник
источник
источник
Почему никто из вас не использует это?
Слишком медленно?
источник
Учитывая юникод. Код проверен в python3.
источник
Удалить стоп-слова из текстового файла с помощью Python
источник
Мне нравится использовать такую функцию:
источник
abc.strip(string.punctuation)
вместо этого для этого. Это не удалит такие символы в середине .