Каков наилучший способ вырезать все не алфавитно-цифровые символы из строки, используя Python?
Решения, представленные в PHP-варианте этого вопроса , вероятно, будут работать с некоторыми незначительными изменениями, но не кажутся мне «питонными».
Для справки, я хочу не просто удалять точки и запятые (и другие знаки пунктуации), но также и кавычки, скобки и т. Д.
Ответы:
Я просто рассчитал некоторые функции из любопытства. В этих тестах я удаляю не алфавитно-цифровые символы из строки
string.printable
(часть встроенногоstring
модуля). Использование скомпилировано'[\W_]+'
иpattern.sub('', str)
признано самым быстрым.источник
valid_characters = string.ascii_letters + string.digits
за которым следовало,join(ch for ch in string.printable if ch in valid_characters)
и это было на 6 микросекунд быстрее, чемisalnum()
опция. Хотя все еще намного медленнее, чем регулярное выражение.pattern.sub('', string.printable)
вместо этого сделайте глупый вызов re.sub, когда у вас есть объект RE! -).re.compile('[\W_]+', re.UNICODE)
чтобы сделать Unicode безопасным.Регулярные выражения на помощь:
источник
\W
будет подчеркивать.Используйте метод str.translate () .
Предполагая, что вы будете делать это часто:
(1) Однажды создайте строку, содержащую все символы, которые вы хотите удалить:
(2) Всякий раз, когда вы хотите сократить строку:
Стоимость установки, вероятно, выгодно отличается от re.compile; предельные издержки намного ниже:
Примечание. Использование string.printable в качестве эталонных данных дает шаблону «[\ W _] +» несправедливое преимущество ; все не алфавитно-цифровые символы находятся в одной связке ... в типичных данных можно сделать более одной замены:
Вот что произойдет, если вы дадите re.sub немного больше работы:
источник
string.punctuation
вместо''.join(c for c in map(chr, range(256)) if not c.isalnum())
str
объектов, но не дляunicode
объектов..join()
?Вы можете попробовать:
источник
источник
Как насчет:
Это работает с использованием списочного понимания, чтобы создать список символов,
InputString
если они присутствуют в комбинацииascii_letters
иdigits
строках. Затем он объединяет список в строку.источник
В дополнение к некоторым другим ответам здесь, я предлагаю действительно простой и гибкий способ определения набора символов, которым вы хотите ограничить содержимое строки. В этом случае я разрешаю буквенно-цифровые символы плюс тире и подчеркивание. Просто добавьте или удалите символы из моего,
PERMITTED_CHARS
как вам подходит.источник
string.digits + string.ascii_letters + '_-'
.SPECIAL_CHARS = '_-'
и затем использоватьstring.digits + string.ascii_letters + SPECIAL_CHARS
источник
e for e in sent
и проверяет черезif e.isalpha()
оператор, является ли текущий символ буквенным символом, если так - присоединяет его кsent
переменной с помощьюsent = "".join()
и все не алфавитные символы будут заменены на""
(пустая строка), потому что изjoin
функции.источник
Синхронизация со случайными строками печатных форм ASCII:
Результат (Python 3.7):
str.maketrans
&str.translate
является самым быстрым, но включает в себя все не-ASCII символы.re.compile
&pattern.sub
медленнее, но как-то быстрее чем''.join
&filter
.источник
Если я правильно понял, самый простой способ - это использовать регулярное выражение, поскольку оно предоставляет вам большую гибкость, но другой простой способ - использовать для следования за циклом - код с примером, который я также посчитал вхождения слова и сохранил в словаре.
Пожалуйста, оцените это, если этот ответ полезен!
источник