如何从字符串中删除标点并记住字符串中

时间:2016-02-11 15:41:12

标签: string python-3.x if-statement for-loop dictionary

您好我一直在尝试创建一个获取字符串并删除所有标点符号和大小写的程序,然后程序应该将所有标点符号和大小写插入到它来自的地方的句子中。

这是我到目前为止所得到的;

sentence = 'I am called bob. What is your name?'
punc = ('!', '"', '£', '$', '%', '^', '&', '*', '(', ')', '¬', '`', '{', '}', '~', '@', ':', '?', '>', '<', ',', '.', '/', ';', '#', ']', '[', '/', '*')

Dictionary = {}
count = 0

for i in sentence:
    count = count + 1
    if i == punc:
        Dictionary[i] = count 

print(Dictionary)

我知道它不是很多,它没有做任何事情(我不知道为什么),但任何帮助将不胜感激。

我正在使用python 3.4

1 个答案:

答案 0 :(得分:0)

字符串是不可变的,因此没有insert或remove方法。但是,您可以将其更改为一个肯定是可变的列表。我可能有一个字典,标点符号作为键和每个索引的列表。您可能遇到的问题是,如果您有多个标点符号,则无法保证它们将以正确的顺序插入。例如:

sentence = 'I am called bob. What is your name?'
punc = ('!', '"', '£', '$', '%', '^', '&', '*', '(', ')', '¬', '`', '{', '}', '~', '@', ':', '?', '>', '<', ',', '.', '/', ';', '#', ']', '[', '/', '*')

sentence = list(sentence)
Dictionary = {}

for i, p in enumerate(sentence): # enumerate() returns an iterable in (index, value) format
    if p in punc:
        if p in Dictionary:
            Dictionary[p].append(i)
        else:
            Dictionary[p] = [i]

print(Dictionary) # => {'?': [34], '.': [15]}

例如,如果我有一个带有随机数量的各种标点符号的奇怪格式的字符串:

sentence = 'I? am. cal?led ,bob. Wh,at. is your .name?.'
... # above code
print(sentence) # => "I? am. call?ed bob,. What .i,s your .name?."

这显然是不正确的。唯一可靠的方法是从最低元素到最高元素迭代dict并以这种方式添加它们。

最终代码:

original = sentence = 'I? am. cal?led ,bob. Wh,at. is your .name?.'
punc = ('!', '"', '£', '$', '%', '^', '&', '*', '(', ')', '¬', '`', '{', '}', '~', '@', ':', '?', '>', '<', ',', '.', '/', ';', '#', ']', '[', '/', '*')

sentence = list(sentence)
Dictionary = {}
seq = [] # list of all indices with any punctuation 

for i, p in enumerate(sentence):
    if p in punc:
        seq.append(i)
        if p in Dictionary:
            Dictionary[p].append(i)
        else:
            Dictionary[p] = [i]

sentence = list(filter(lambda x: x not in punc, sentence))
for i in seq:
    for key, indices in Dictionary.items():
        if i in indices:
            sentence.insert(i, key)
            indices.remove(i)
assert(''.join(sentence) == original)