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

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

20 ответов

Решение

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

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

[^A-Za-z0-9]+

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

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

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

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

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

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

Я думаю просто filter(str.isalnum, string) работает

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
#!/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

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

String .punctuation содержит следующие символы:

'! "# $% & \' () * +, -. /:;<=>? @ [\] ^ _` {|} ~ '

Вы можете использовать функции translate и maketrans для сопоставления знаков препинания с пустыми значениями (заменить)

import string

'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))

Выход:

'This is A test'

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

Например, если мне нужны только символы от '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())
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)

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

Для других языков, таких как немецкий, испанский, датский, французский и т. Д., Которые содержат специальные символы (например, немецкий "Umlaute" как ü, ä, ö) просто добавьте их в строку поиска регулярного выражения:

Пример для немецкого:

re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)

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

      import re

sample_str = "Hel&&lo %% Wo$#rl@d"

# using isalnum()
print("".join(k for k in sample_str if k.isalnum()))


# using regex
op2 = re.sub("[^A-Za-z]", "", sample_str)
print(f"op2 = ", op2)


special_char_list = ["$", "@", "#", "&", "%"]

# using list comprehension
op1 = "".join([k for k in sample_str if k not in special_char_list])
print(f"op1 = ", op1)


# using lambda function
op3 = "".join(filter(lambda x: x not in special_char_list, sample_str))
print(f"op3 = ", op3)

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

import string

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

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

Это удалит все не буквенно-цифровые символы, кроме пробелов.

      string = "Special $#! characters   spaces 888323"
''.join(e for e in string if (e.isalnum() or e.isspace()))

Пробелы для специальных символов 888323

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

и вы увидите ваш результат как

"askhnlaskdjalsdk

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

Пример:-

Код

combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ") 

Результат: -

Спасибо:)

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"))

Спустя 10 лет ниже я написал, что есть лучшее решение. Вы можете удалить / очистить все специальные символы, знаки препинания, символы ASCII и пробелы из строки.

      from clean_text import clean

string = 'Special $#! characters   spaces 888323'
new = clean(string,lower=False,no_currency_symbols=True, no_punct = True,replace_with_currency_symbol='')
print(new)
Output ==> 'Special characters spaces 888323'
you can replace space if you want.
update = new.replace(' ','')
print(update)
Output ==> 'Specialcharactersspaces888323'
      function regexFuntion(st) {
  const regx = /[^\w\s]/gi; // allow : [a-zA-Z0-9, space]
  st = st.replace(regx, ''); // remove all data without [a-zA-Z0-9, space]
  st = st.replace(/\s\s+/g, ' '); // remove multiple space

  return st;
}

console.log(regexFuntion('$Hello; # -world--78asdf+-===asdflkj******lkjasdfj67;'));
// Output: Hello world78asdfasdflkjlkjasdfj67
Другие вопросы по тегам