在python中删除字符串中的punctiations

时间:2017-05-25 18:03:46

标签: python indexing palindrome punctuation

这是我编写的用于从字符串

中删除逗号和句号的代码
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

但它给出了一个错误,说字符串索引超出范围

有人可以解释原因吗?

4 个答案:

答案 0 :(得分:1)

您可以使用re模块

更好地完成此操作
>>> import re
>>> s = "asdsd,dweds.,sdfsf."
>>> re.sub('(,|\.)', '', s)
'asdsddwedssdfsf'

答案 1 :(得分:1)

你可以用一个简单的in循环迭代一个字符串,你不需要打扰索引。

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

答案 2 :(得分:0)

我看到两个问题:

  • len(text)在循环开始时只计算一次。 text在您迭代它时收缩的事实,对i稍后会有什么价值没有任何影响。
  • 在循环中递减i对下一次迭代中i的值没有影响。 Python只是简单地压缩旧值而不看它。

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

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

答案 3 :(得分:0)

您可以使用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