0

我有一个标点符号列表,我希望循环从用户输入的句子中删除,它似乎连续忽略多个标点符号?

punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"]
usr_str=input('Type in a line of text: ')

#Convert to list
usr_list= list(usr_str)

#Checks if each item in list is punctuation, and removes ones that are
for char in usr_list:
    if char in punctuation:
        usr_list.remove(char)

#Prints resulting string
print(''.join(usr_list))

现在这适用于:

This is an example string, which works fine!

哪个打印:

This is an example string which works fine

但是,像这样:

Testing!!!!, )

给出:

Testing!!

在此先感谢您的帮助!

4

2 回答 2

2

您在迭代列表正在更改列表。从来不是一个好主意。

让它工作的一种方法是遍历列表的副本:

for char in usr_list[:]:  # this is the only part that changed; add [:] to make a copy
    if char in punctuation:
        usr_list.remove(char)

有了更多经验,您可能会改用“列表理解”:

usr_list = [char for char in usr_list if char not in punctuation]

您可能会使用filter()或正则表达式或...得到其他答案。但一开始要保持简单:-)

另一种方法是制作两个不同的列表。假设您的输入列表是input_list. 然后:

no_punc = []
for char in usr_list:
    if char not in punctuation:
        no_punc.append(char)

请注意,实际上也没有必要以这种方式使用输入列表。你可以直接迭代你的usr_str

于 2013-10-18T02:24:45.303 回答
2

这可以使用str.translate以下方法完成:

In [10]: 'Testing!!!!, )'.translate(str.maketrans('', '', string.punctuation))
Out[10]: 'Testing '
于 2013-10-18T02:26:28.173 回答