是否有任何方法可以在字符串之间添加而不将字符串更改为列表 - 或者字符串是不可变的?

时间:2016-02-16 23:11:28

标签: python string

我是Python的初学者,我正在做一些简单的问题。但是,我遇到以下问题:

  

定义一个简单的“拼写校正”函数correct(),它需要一个   字符串并看到它:

     

1)将两个或更多个空格字符压缩成   一,和

     

2)如果周期是直接的话,在一段时间后插入一个额外的空格   接着是一封信。例如。正确(“这(多个空格)是(多个空格)非常有趣(多个空格)和(多个空格)cool.Indeed!”)应该返回“这非常有趣和酷。确实!”

     

提示:使用正则表达式!

这是我的代码:

def correct(x):
    y = x.split()
    y = list(y)
    for i in y:
        if i == " ":
            for o in y:
                if o == " ":
                    y.remove(o)
        y.insert(y.index(i)," ")
        if i == ".":
            y.insert(y.index(i)+1," ")
    y = " ".join(y)
    return y

print(correct("This   is  very funny  and    cool.Indeed!"))

当我运行程序时,我没有输出。我不知道我做错了什么。有没有其他方法在字符串之间添加而不将字符串更改为列表?或者字符串是不可变的吗?

4 个答案:

答案 0 :(得分:1)

@ John La Rooy,也许你的代码更短......我认识到自己,我没有看到你的答案,我不会被完成....,你是主人......

def correct(s):
    s = raw_input("Please give a sentece: ")
    return " ".join(s.replace(".", ". ").split())
print correct('s')

答案 1 :(得分:0)

字符串是不可变的,但与列表的行为类似。您不一定需要将它们“转换”为列表。你可以这样做:

myString = "Insert Here -><- Insert There"
myString = myString[:14] + "Inserted" + mystring[14:]
# => myString == "Insert Here ->Inserted<- Insert There"

但是,是的,字符串是不可变的,不能像列表那样“插入”。为此,您必须将它们转换为列表。

在您的情况下,您可以在re正则表达式模块中使用。为了将多个出现压缩在一起,您可以执行以下操作:

import re
answer = re.sub(r' +', r' ', myString)
但是,

替换确实有效,因为它会创建一个新实例。

>>> s = "Test"
>>> id(s)
41325568
>>> s = s.replace("s", "x")
>>> id(s)
41325600
>>> s
'Text'
>>>

因此您可以轻松替换“。”用“。”然后运行正则表达式来压缩它。最终结果如下:

def correct(myString):
    myString = myString.replace(".", ". ") # Even if there is already a space, it doesn't matter
    import re
    return re.sub(r' +', r' ', myString)

如果您不想或不允许使用re模块,您可以使用此单行

>>> def correct(myString):
...     return ' '.join(myString.replace('.', '. ').split())
...
>>> myString = "This   is  very funny  and    cool.Indeed!"
>>> correct(myString)
'This is very funny and cool. Indeed!'
>>>

请注意,这不会考虑多个句点或其他标点符号类型,或者最后一个字符是句点。它还会折叠其他形式的空格(制表符等)。所以:
"In a galaxy far,far away..."
变为:
"In a galaxy far,far away. . ."

我们建议您使用re。它也明显更快。

答案 2 :(得分:0)

考虑灵活性 - 如果您想延长修正规则会怎样......

这是一个可扩展的例子:

import re

correction_rules = [
 {'search_for': r'[\s]{2,}', 'replace_with': ' '},
 {'search_for': r'(\.)([^\s])', 'replace_with': r'\1 \2'},
]

def correct(s, rules=correction_rules):
    new_s = s
    for r in rules:
        new_s = re.sub(r['search_for'], r['replace_with'], new_s)
    return new_s

print(correct("This   is  very funny  and    cool.Indeed!", correction_rules))

答案 3 :(得分:0)

这可以在没有正则表达式的情况下完成。请注意,您可以在“。”之后添加额外的空格。因为你将在第二步中删除虚假的那些。

>>> def correct(s):
...     s = s.replace(".", ". ")
...     s = " ".join(s.split())
...     return s
... 
>>> print(correct("This   is  very funny  and    cool.Indeed!"))
This is very funny and cool. Indeed!