去除 python 中字符串中的标点符号

Getting rid of punctiations in a string in python

这是我编写的用于从字符串中删除逗号和句号的代码

forbidden=(",",".")
text=input("Your sentence")
for i in range(0,len(text)):
    if text[i] in forbidden:
         text=text.replace(text[i],'')
         i-=1
print text

我的输入是a,n

但是报错说字符串索引超出范围

谁能解释为什么?

您可以使用 re 模块

以更好的方式做到这一点
>>> import re
>>> s = "asdsd,dweds.,sdfsf."
>>> re.sub('(,|\.)', '', s)
'asdsddwedssdfsf'

你可以用一个简单的 for in 循环遍历一个字符串,你不需要为索引而烦恼。

forbidden=(",",".")
text=input("Your sentence")
for c in text:
    if c in forbidden:
        text=text.replace(c,'')
print text

我看到两个问题:

  • len(text) 在循环开始时恰好计算一次。 text 在您对其进行迭代时缩小的事实对 i 以后的值没有任何影响。
  • 在循环中递减 i 对下一次迭代中 i 的值没有影响。 Python 简单地翻过旧值而不看它。

如果您绝对致力于通过遍历 text 的索引来实现此算法,那么使用 while 循环将解决这两个问题。 while 循环的条件会在每次迭代时进行评估,并且您可以完全控制 incrementing/decrementing.

的值
forbidden=(",",".")
text=raw_input("Your sentence: ")
i = 0
while i < len(text):
    if text[i] in forbidden:
        text=text.replace(text[i],'')
    else:
        i+=1
print text

输出:

Your sentence: foo,bar,baz.qux,troz,zort.
foobarbazquxtrozzort

...但是如果您对不同的方法持开放态度,那么如果您迭代禁用字符而不是 text.

将会节省您很多精力
forbidden=(",",".")
text=raw_input("Your sentence: ")
for c in forbidden:
    text = text.replace(c, "")
print text

您可以使用 list comprehensions 过滤点和逗号,然后使用 reduce() 将元素添加到 string 中,例如:

    forbidden = (",", ".")
    text = 'a,n'
    text = reduce(lambda x, y: x + y, [i for i in text if i not in forbidden])
    print text

或者您可以使用

text = ''.join([i for i in text if i not in forbidden])

输出:

an