Мені потрібно видалити всі спеціальні символи, розділові знаки та пробіли з рядка, щоб у мене залишилися лише літери та цифри.
Мені потрібно видалити всі спеціальні символи, розділові знаки та пробіли з рядка, щоб у мене залишилися лише літери та цифри.
Відповіді:
Це можна зробити без регулярного вираження:
>>> 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()
і версії, і
Ось регулярний вираз, який відповідає рядку символів, який не є буквою чи цифрою:
[^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( )
функція повертає ітерабельний об'єкт (замість рядка на відміну від вище). Треба приєднатися назад, щоб отримати рядок з ітерабету:
''.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-пізнавальний код 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 містить такі символи:
'! "# $% & \' () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '
Ви можете використовувати функції перекладу та макетрансу для відображення розділових знаків на порожні значення (заміни)
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 + ' ')
Caveat: працює лише на струнах 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#]", " ")
Дякую :)