Заменить пунктуацию пробелом

У меня проблема с кодом и не могу понять, как двигаться вперед.

tweet = "I am tired! I like fruit...and milk"
clean_words = tweet.translate(None, ",.;@#?!&$")
words = clean_words.split()

print tweet
print words

Вывод:

['I', 'am', 'tired', 'I', 'like', 'fruitand', 'milk']

Что бы я хотел, это заменить пунктуацию пробелом, но не знаю, какую функцию или использовать цикл. Кто-нибудь может мне помочь?

Ответ 1

Это легко сделать, поменяв "макетранс" следующим образом:

import string
tweet = "I am tired! I like fruit...and milk"
translator = string.maketrans(string.punctuation, ' '*len(string.punctuation)) #map punctuation to space
print(tweet.translate(translator))

Он работает на моей машине с Python 3.5.2 и 2.x. Надеюсь, что это работает и у вас.

Ответ 2

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

import re

tweet = "I am tired! I like fruit...and milk"
clean = re.sub(r"""
               [,.;@#?!&$]+  # Accept one or more copies of punctuation
               \ *           # plus zero or more copies of a space,
               """,
               " ",          # and replace it with a single space
               tweet, flags=re.VERBOSE)
print(tweet + "\n" + clean)

Результаты:

I am tired! I like fruit...and milk
I am tired I like fruit and milk

Компактная версия:

tweet = "I am tired! I like fruit...and milk"
clean = re.sub(r"[,.;@#?!&$]+\ *", " ", tweet)
print(tweet + "\n" + clean)

Ответ 3

Существует несколько способов решения этой проблемы. У меня есть тот, который работает, но считаю, что он субоптимален. Надеюсь, кто-то, кто знает regex лучше, придет и улучшит ответ или предложит лучший.

Ваш вопрос помечен как python-3.x, но ваш код - python 2.x, поэтому мой код равен 2.x. Я включаю версию, которая работает в 3.x.

#!/usr/bin/env python

import re

tweet = "I am tired! I like fruit...and milk"
# print tweet

clean_words = tweet.translate(None, ",.;@#?!&$")  # Python 2
# clean_words = tweet.translate(",.;@#?!&$")  # Python 3
print(clean_words)  # Does not handle fruit...and

regex_sub = re.sub(r"[,.;@#?!&$]+", ' ', tweet)  # + means match one or more
print(regex_sub)  # extra space between tired and I

regex_sub = re.sub(r"\s+", ' ', regex_sub)  # Replaces any number of spaces with one space
print(regex_sub)  # looks good

Ответ 4

Я не уверен, что полностью понимаю ваши требования, но подумал ли вы добавить в свой текущий код еще одну строку:

>>> a=['I', 'am', 'tired', 'I', 'like', 'fruitand', 'milk']
>>> " ".join(a)
'I am tired I like fruitand milk'

Это то, что вы просите, или вам нужно что-то более конкретное? С наилучшими пожеланиями.

Ответ 5

Если вы используете Python 2.x, вы можете попробовать:

import string

tweet = "I am tired! I like fruit...and milk"
clean_words = tweet.translate(string.maketrans("",""), string.punctuation)

print clean_words

Для Python 3.x он работает:

import string

tweet = "I am tired! I like fruit...and milk"
transtable = str.maketrans('', '', string.punctuation)
clean_words = tweet.translate(transtable)

print(clean_words)

Эти части кода удаляют все символы пунктуации из строки.