Удалить все специальные символы, знаки препинания и пробелы из строки - PullRequest
179 голосов
/ 30 апреля 2011

Мне нужно удалить все специальные символы, знаки препинания и пробелы из строки, чтобы у меня были только буквы и цифры.

Ответы [ 13 ]

288 голосов
/ 30 апреля 2011

Это можно сделать без regex:

>>> 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.

Если вы настаиваете на использовании regex другие решения подойдут.Однако обратите внимание, что если это можно сделать без использования регулярного выражения, это лучший способ сделать это.

177 голосов
/ 30 апреля 2011

Вот регулярное выражение, соответствующее строке символов, которые не являются буквами или цифрами:

[^A-Za-z0-9]+

Вот команда Python для подстановки регулярных выражений:

re.sub('[^A-Za-z0-9]+', '', mystring)
38 голосов
/ 07 августа 2014

Короткий путь:

import re
cleanString = re.sub('\W+','', string )

Если вам нужны пробелы между словами и числами, замените '' на ''

21 голосов
/ 06 августа 2016

Увидев это, я заинтересовался расширением предоставленных ответов, выяснив, какие из них выполняются за наименьшее количество времени, поэтому я просмотрел и проверил некоторые из предложенных ответов с 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.7061979771
  • string2 - Результат: 7.78372597694

Пример 2

import re re.sub('[^A-Za-z0-9]+', '', string)

  • string1 - Результат: 7.10785102844
  • string2 - Результат: 4.12814903259

Пример 3

import re re.sub('\W+','', string)

  • string1 - Результат: 3.11899876595
  • string2 - Результат: 2.78014397621

Вышеуказанные результаты являются результатом наименьшего возвращаемого результата из среднего значения: repeat(3, 2000000)

Пример 3 может быть в 3 раза быстрее, чем Пример 1 .

19 голосов
/ 14 апреля 2016

Python 2. *

Я думаю, что только filter(str.isalnum, string) работает

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'

Python 3. *

В Python3 функция filter( ) будет возвращать прерывистыйобъект (вместо строки в отличие от выше).Нужно присоединиться назад, чтобы получить строку из itertable:

''.join(filter(str.isalnum, string)) 

или передать list при использовании соединения ( не уверен, но может быть быстрым )

''.join([*filter(str.isalnum, string)])

примечание: распаковка в [*args] действует с Python> = 3,5

15 голосов
/ 25 мая 2014
#!/usr/bin/python
import re

strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr

вы можете добавить больше специальных символов, и они будут заменены на '' ничего не значит, т.е. они будут удалены.

9 голосов
/ 05 сентября 2018

В отличие от всех остальных, использующих регулярные выражения, я бы попытался исключить каждый символ, который не , что я хочу, вместо того, чтобы явно перечислять то, что я не хочу.

Например, если мне нужны только символы от «a до z» (верхний и нижний регистр) и цифры, я бы исключил все остальное:

import re
s = re.sub(r"[^a-zA-Z0-9]","",s)

Это означает «заменить каждый символ, который не является числом, илисимвол в диапазоне 'от a до z' или от 'A до Z' с пустой строкой ".

Фактически, если вы вставите специальный символ ^ в первое место вашего регулярного выражения, вы получитеотрицание.

Дополнительный совет: если вам также нужно строчные буквы результат, вы можете сделать регулярное выражение еще быстрее и проще, если вы не найдете никаких заглавных букв сейчас.

import re
s = re.sub(r"[^a-z0-9]","",s.lower())
7 голосов
/ 01 мая 2011

Предполагая, что вы хотите использовать регулярное выражение и вам нужен / нужен Unicode-cognizant 2.x код, готовый к 2to3:

>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
5 голосов
/ 15 июня 2018
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
5 голосов
/ 30 апреля 2011

Наиболее общий подход заключается в использовании «категорий» таблицы unicodedata, которая классифицирует каждый отдельный символ.Например, следующий код фильтрует только печатаемые символы в зависимости от их категории:

import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien

PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))

def filter_non_printable(s):
    result = []
    ws_last = False
    for c in s:
        c = unicodedata.category(c) in PRINTABLE and c or u'#'
        result.append(c)
    return u''.join(result).replace(u'#', u' ')

Просмотрите приведенный выше URL-адрес для всех связанных категорий.Вы также можете, конечно, фильтровать по категориям пунктуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...