Удалите все специальные символы, знаки препинания и пробелы из строки

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

Ответ 1

Это можно сделать без регулярных выражений:

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

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

Ответ 2

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

[^A-Za-z0-9]+

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

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

Ответ 3

Более короткий путь:

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

#!/usr/bin/python
import re

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

вы можете добавить более специальный символ и который будет заменен на "", значит, ничего не будет. Они будут удалены.

Ответ 7

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

Например, если мне нужны только символы от '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())

Ответ 8

Предполагая, что вы хотите использовать регулярное выражение, и вы хотите/нуждаетесь в коде 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'
>>>

Ответ 9

Наиболее общий подход заключается в использовании "категорий" таблицы 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 выше для всех связанных категорий. Вы также можете, конечно, фильтровать по пунктуационным категориям.

Ответ 10

s = re.sub(r"[-()\"#/@;:<>{}'+=~|.!?,]", "", s)

Ответ 11

Использовать перевод:

import string

def clean(instr):
    return instr.translate(None, string.punctuation + ' ')

Предостережение: работает только с строками ascii.

Ответ 12

import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

и вы увидите свой результат как

'askhnlaskdjalsdk

Ответ 13

import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the 

так же, как двойные кавычки.

# if we need to count the word python that ends with or without ',' or '.' at end

count = 0
for i in text:
    if i.endswith("."):
        text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
    count += 1
print("The count of Python : ", text.count("python"))