Мне нужно удалить все специальные символы, знаки препинания и пробелы из строки, чтобы у меня были только буквы и цифры.
236
Это можно сделать без регулярных выражений:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Вы можете использовать str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
Если вы настаиваете на использовании регулярных выражений, другие решения подойдут. Однако обратите внимание, что если это можно сделать без использования регулярного выражения, это лучший способ сделать это.
isalnum()
версии и с регулярным выражением, и с регулярным выражением на 50-75% быстрееВот регулярное выражение, соответствующее строке символов, которые не являются буквами или цифрами:
Вот команда Python для подстановки регулярных выражений:
источник
+
квантификатор, чтобы немного повысить его эффективность.)[^A-Za-z0-9 ]+
Более короткий путь:
Если вы хотите пробелы между словами и числами, замените '' на ''
источник
r'\W+'
- немного не по теме (и очень педантично), но я предлагаю привычку, чтобы все шаблоны регулярных выражений были необработанными строкамиУвидев это, я был заинтересован в расширении предоставленных ответов, выяснив, какие из них выполняются за наименьшее количество времени, поэтому я просмотрел и проверил некоторые из предложенных ответов с
timeit
двумя примерами строк:string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
Пример 1
'.join(e for e in string if e.isalnum())
string1
- Результат: 10.7061979771string2
- Результат: 7.78372597694Пример 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Результат: 7.10785102844string2
- Результат: 4.12814903259Пример 3
import re re.sub('\W+','', string)
string1
- Результат: 3.11899876595string2
- Результат: 2.78014397621Вышеуказанные результаты являются результатом наименьшего возвращенного результата из среднего значения:
repeat(3, 2000000)
Пример 3 может быть в 3 раза быстрее, чем Пример 1 .
источник
''.join([*filter(str.isalnum, string)])
Python 2. *
Я думаю просто
filter(str.isalnum, string)
работаетPython 3. *
В Python3
filter( )
функция возвращает возвращаемый объект (вместо строки в отличие от описанной выше). Нужно присоединиться, чтобы получить строку из itertable:или перейти
list
в режим соединения ( не уверен, но может быть немного быстрее )примечание: распаковка
[*args]
действительна из Python> = 3.5источник
map
,filter
иreduce
возвращает объект вместо itertable. Тем не менее, в Python3 + я предпочитаю''.join(filter(str.isalnum, string))
(или пропускаю список при использовании соединения''.join([*filter(str.isalnum, string)])
) перед принятым ответом.''.join(filter(str.isalnum, string))
что это улучшениеfilter(str.isalnum, string)
, по крайней мере, для чтения. Это действительно пифринский (да, вы можете использовать это) способ сделать это?filter(str.isalnum, string)
в Python3 не нужно возвращать строку, так какfilter( )
в Python-3 возвращает итератор, а не тип аргумента, в отличие от Python-2. +Вы можете добавить больше специальных символов, и они будут заменены на '', что означает ничего, т.е. они будут удалены.
источник
В отличие от всех остальных, использующих регулярные выражения, я бы попытался исключить каждый символ, который не является тем, что я хочу, вместо того, чтобы явно перечислять то, что я не хочу.
Например, если мне нужны только символы от 'a до z' (верхний и нижний регистр) и цифры, я бы исключил все остальное:
Это означает «заменить каждый символ, который не является числом или символом в диапазоне от« a до z »или« от A до Z », пустой строкой».
Фактически, если вы вставите специальный символ
^
в первое место вашего регулярного выражения, вы получите отрицание.Дополнительный совет: если вам также нужно уменьшить регистр в результатах, вы можете сделать регулярное выражение еще быстрее и проще, если вы не найдете никаких заглавных букв сейчас.
источник
Предполагая, что вы хотите использовать регулярное выражение и вам нужен / нужен Unicode-cognizant 2.x код, готовый к 2to3:
источник
источник
Наиболее общий подход заключается в использовании «категорий» таблицы unicodedata, которая классифицирует каждый отдельный символ. Например, следующий код фильтрует только печатные символы в зависимости от их категории:
Посмотрите на приведенный выше URL для всех связанных категорий. Вы также можете, конечно, фильтровать по категориям пунктуации.
источник
$
в конце каждой строки?string.punctuation содержит следующие символы:
Вы можете использовать функции translate и maketrans для отображения знаков препинания в пустые значения (заменить)
Вывод:
источник
Используйте перевод:
Предостережение: работает только для строк ascii.
источник
TypeError: translate() takes exactly one argument (2 given)
с py3.4так же, как двойные кавычки.
источник
и вы увидите ваш результат как
«askhnlaskdjalsdk
источник
re
но никогда не использовали его. Вашиreplace
критерии работают только для этой конкретной строки. Что если ваша строкаabc = "askhnl#$%!askdjalsdk"
? Я не думаю, что будет работать на что-либо, кроме#$%
шаблона. Может быть, хочу настроить этоУдаление знаков препинания, чисел и специальных символов
Пример :-
Код
Результат: -
Спасибо :)
источник
Для других языков , таких как немецкий, испанский, датский, французский и т.д. , которые содержат специальные символы (например , немецкий «Umlaute» , как
ü
,ä
,ö
) просто добавить их в поисковой строке регулярное выражение:Пример для немецкого языка:
источник