Мне нужно удалить все специальные символы, знаки препинания и пробелы из строки, чтобы у меня были только буквы и цифры.
Удалите все специальные символы, знаки препинания и пробелы из строки
Ответ 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"))