如何从字符串中删除标点符号

时间:2019-09-13 14:59:03

标签: python

我一直在从事的项目之一是创建一个单词计数器,然后,我必须有效地删除字符串中的所有标点符号。

我尝试使用split方法并在标点符号处进行分割,但是,这将使列表变得很奇怪(从一个单词分开到一个包含5个单词的列表)。然后,我尝试使用一个列表或一个充满标点符号的字符串,并使用for循环来消除所有标点符号,但都无法成功

content_string = "This, is a test! to see: whether? or not. the code can eliminate punctuation"
punctuation = list["'", '"', ',', '.', '?', '!', ':', ';', '()']
for i in content_string.lower():
    if i in punctuation:
        i = i.replace[i," "]
    else:
        i = i

  

“ TypeError:'类型'对象不可下标”

使用字符串或列表时都会出现此消息。

4 个答案:

答案 0 :(得分:1)

括号和方括号混在一起。 listreplace是函数,参数带有括号传递。

此外,尝试用文字描述您的算法: 例如:

对于所有禁止的字符,我想将其从内容中删除(用空格代替)

这是您可以从以下开始的实现:

content_string = "This, is a test! to see: whether? or not. the code can eliminate punctuation"
punctuation = ["'", '"', ',', '.', '?', '!', ':', ';', '(', ')']
for i in punctuation:
    content_string = content_string.replace(i, " ")

答案 1 :(得分:0)

要创建列表,请使用l = [...]而不是l = list[...],并且函数/方法(例如str.replace)用括号而不是方括号来调用,但是,您可以使用{ {1}}以更好,更简单的方式做到这一点:

re.sub

输出:

content_string = "This, is a test! to see: whether? or not. the code can eliminate punctuation"

punctuation = ["'", '"', ',', '.', '?', '!', ':', ';', '(', ')'] # '(', ')' not `()`

import re

new_string = re.sub('|'.join(map(re.escape, punctuation)), '', content_string)

print(new_string)

答案 2 :(得分:0)

您的错误

"TypeError: 'type' object is not subscriptable"

来自这一行

punctuation = list["'", '"', ',', '.', '?', '!', ':', ';', '()']

要定义列表,请使用不带关键字列表的方括号[],或者如果使用列表,则必须加上括号(尽管在这种情况下将列表转换为列表是多余的)

# both options will work, but the second one is redundant and therefore wrong
punctuation = ["'", '"', ',', '.', '?', '!', ':', ';', '(', ')']
punctuation = list(["'", '"', ',', '.', '?', '!', ':', ';', '(', ')'])

请注意,最后一个元素()必须分为两个元素()

现在要以有效的方式实现所需的目标,请使用条件理解列表

''.join([i if i not in punctuation else ' ' for i in content_string])

结果:

'This  is a test  to see  whether  or not  the code can eliminate punctuation'

请注意,根据您的代码,您不是删除标点符号,而是将其替换为空格。

答案 3 :(得分:0)

代码中有多个错误。

第一个:

list关键字已过时。 如果要使用它,则需要添加括号(),以便可以对已定义列表中的项目进行正确的调用。

不良punctuation = list["'", '"', ',', '.', '?', '!', ':', ';', '()']

更好punctuation = list(["'", '"', ',', '.', '?', '!', ':', ';', '()'])

但是仅使用常规[]语法定义列表就足够了,并且比list()调用更有效。

第二个:

您将无法用if i in punctuation:代替括号。 这是因为它们是两个字符长的字符串,并且您要遍历字符串的单个字符。因此,您将始终将'('')''()'进行比较。

可能的解决方法-将括号作为单个字符单独添加到标点符号列表中。

第三错误,或者说是过时的其他说明:

    else:
        i = i

该服务器毫无用处,您应该跳过else指令。

第四,最明显的错误:

在for循环中,您正在编辑i变量,该变量是要迭代的字符串中单个字符的副本。您应该对原始字符串进行更改,这可以通过使用enumerate来完成-仅当您首先将字符串转换为列表时,才可以修改其值。

for i, char in enumerate(list(content_string.lower())):
    if char in punctuation:
        content_string[i] = ' '

无论如何,您可以使用列表理解和随后的结果列表上的字符串连接将您要达到的目标归结为一类:

content_string = ''.join([char if char not in punctuation else ' ' for char in content_string.lower()])