Мне нужно удалить все специальные символы, знаки препинания и пробелы из строки, чтобы у меня были только буквы и цифры.
Мне нужно удалить все специальные символы, знаки препинания и пробелы из строки, чтобы у меня были только буквы и цифры.
Ответы:
Это можно сделать без регулярных выражений:
>>> 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% быстрее
Вот регулярное выражение, соответствующее строке символов, которые не являются буквами или цифрами:
[^A-Za-z0-9]+
Вот команда Python для подстановки регулярных выражений:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
квантификатор, чтобы немного повысить его эффективность.)
[^A-Za-z0-9 ]+
Более короткий путь:
import re
cleanString = re.sub('\W+','', string )
Если вы хотите пробелы между словами и числами, замените '' на ''
r'\W+'
- немного не по теме (и очень педантично), но я предлагаю привычку, чтобы все шаблоны регулярных выражений были необработанными строками
Увидев это, я был заинтересован в расширении предоставленных ответов, выяснив, какие из них выполняются за наименьшее количество времени, поэтому я просмотрел и проверил некоторые из предложенных ответов с timeit
двумя примерами строк:
string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
'.join(e for e in string if e.isalnum())
string1
- Результат: 10.7061979771string2
- Результат: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- Результат: 7.10785102844string2
- Результат: 4.12814903259import re
re.sub('\W+','', string)
string1
- Результат: 3.11899876595string2
- Результат: 2.78014397621Вышеуказанные результаты являются результатом наименьшего возвращенного результата из среднего значения: repeat(3, 2000000)
Пример 3 может быть в 3 раза быстрее, чем Пример 1 .
''.join([*filter(str.isalnum, string)])
Я думаю просто filter(str.isalnum, string)
работает
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
В Python3 filter( )
функция возвращает возвращаемый объект (вместо строки в отличие от описанной выше). Нужно присоединиться, чтобы получить строку из itertable:
''.join(filter(str.isalnum, string))
или перейти list
в режим соединения ( не уверен, но может быть немного быстрее )
''.join([*filter(str.isalnum, string)])
примечание: распаковка [*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. +
#!/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
Вы можете добавить больше специальных символов, и они будут заменены на '', что означает ничего, т.е. они будут удалены.
В отличие от всех остальных, использующих регулярные выражения, я бы попытался исключить каждый символ, который не является тем, что я хочу, вместо того, чтобы явно перечислять то, что я не хочу.
Например, если мне нужны только символы от '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())
Предполагая, что вы хотите использовать регулярное выражение и вам нужен / нужен 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'
>>>
Наиболее общий подход заключается в использовании «категорий» таблицы 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 для всех связанных категорий. Вы также можете, конечно, фильтровать по категориям пунктуации.
$
в конце каждой строки?
string.punctuation содержит следующие символы:
"# $% & \! '() * +, - / :; <=> @ [\] ^ _`.? {|} ~'
Вы можете использовать функции translate и maketrans для отображения знаков препинания в пустые значения (заменить)
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Вывод:
'This is A test'
Используйте перевод:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Предостережение: работает только для строк ascii.
TypeError: translate() takes exactly one argument (2 given)
с py3.4
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"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
и вы увидите ваш результат как
«askhnlaskdjalsdk
re
но никогда не использовали его. Ваши replace
критерии работают только для этой конкретной строки. Что если ваша строка abc = "askhnl#$%!askdjalsdk"
? Я не думаю, что будет работать на что-либо, кроме #$%
шаблона. Может быть, хочу настроить это
Удаление знаков препинания, чисел и специальных символов
Пример :-
Код
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
Спасибо :)
Для других языков , таких как немецкий, испанский, датский, французский и т.д. , которые содержат специальные символы (например , немецкий «Umlaute» , как ü
, ä
, ö
) просто добавить их в поисковой строке регулярное выражение:
Пример для немецкого языка:
re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)