Удаление знаков препинания и пробелов в строке без использования регулярных выражений - PullRequest
0 голосов
/ 21 октября 2018

Я использовал импорт string и string.punctuation, но понял, что у меня все еще есть '…' после проведения string.split().Я также получаю '', что я не знаю, почему я получу его после выполнения strip().Насколько я понимаю, strip() удаляет периферийные пространства, поэтому, если у меня есть пробелы между строками, это не имеет значения:

>>> s = 'a dog    barks    meow!   @  … '
>>> s.strip()
'a dog    barks    meow!   @  …'


>>> import string
>>> k = []
>>> for item in s.split():
...  k.append(item.strip(string.punctuation))
... 
>>> k
['a', 'dog', 'barks', 'meow', '', '…']

Я бы хотел избавиться от '', '…', конечного результатаМне бы хотелось, чтобы это было ['a', 'dog', 'barks', 'meow'].

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

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Я использовал следующее:

s = 'a dog    barks    Meow!   @  … '



import string
p = string.punctuation+'…'
k = []
for item in s.split():
    k.append(item.strip(p).lower())


k = [x for x in k if x]
0 голосов
/ 21 октября 2018

основываясь на принятом ответе на этот вопрос :

import itertools

k = []
for ok, grp in itertools.groupby(s, lambda c: c.isalnum()):
    if ok:
        k.append(''.join(list(grp)))

или аналогично однострочному (кроме импорта):

k = [''.join(list(grp)) for ok, grp in itertools.groupby(s, lambda c: c.isalnum()) if ok]

itertools.groupby() сканирует строку s как список символов, группируя их (grp) по значению (ok) лямбда-выражения.if ok отфильтровывает группы, не соответствующие лямбде.Группы являются итераторами, которые должны быть преобразованы в список символов и затем объединены, чтобы получить обратно слова.

Значение isalnum() по сути «буквенно-цифровое».В зависимости от вашего варианта использования, вы можете предпочесть isalpha().В обоих случаях для этого ввода:

s = 'a 狗    barks    meow!   @  …'

вывод составляет

['a', '狗', 'barks', 'meow']

(Для экспертов: это напоминает нам о проблеме, заключающейся в том, что не во всех языках слова разделяются несимволы слова - например )

0 голосов
/ 21 октября 2018

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

s = 'a dog    barks    meow!   @  …'
print(''.join(c for c in s if c.isalnum() or c.isspace()).split())

Это приводит к выводу:

['a', 'dog', 'barks', 'meow']
...