用空格替换标点符号

时间:2016-01-18 17:49:12

标签: python string python-3.x

我的代码有问题,无法弄清楚如何继续前进。

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']

我想要的是用空格替换标点符号,但不知道使用什么函数或循环。有人可以帮帮我吗?

6 个答案:

答案 0 :(得分:13)

通过更改你的" maketrans"很容易实现。像这样:

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

它适用于运行python 3.5.2的我的机器。 希望它也适用于你的。

答案 1 :(得分:4)

这是一个基于正则表达式的解决方案,已经在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)

答案 2 :(得分:0)

有几种方法可以解决这个问题。我有一个有效,但相信它不是最理想的。希望有更好地了解正则表达式的人会出现并改进答案或提供更好的答案。

您的问题标记为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

答案 3 :(得分:0)

这是一个使用列表理解和 str.join 的解决方案:

import string

tweet = "I am tired! I like fruit...and milk"
clean_words = ''.join(' ' if c in string.punctuation else c for c in tweet)
words = clean_words.split()

print(tweet)
print(words)

答案 4 :(得分:-1)

我不确定我是否完全理解您的要求,但您是否考虑在当前代码中仅添加一行,例如:

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

这是你要问的还是你需要更具体的东西?问候。

答案 5 :(得分:-1)

如果您使用的是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)

这些代码部分会删除字符串中的所有标点符号。