我是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!"))
当我运行程序时,我没有输出。我不知道我做错了什么。有没有其他方法在字符串之间添加而不将字符串更改为列表?或者字符串是不可变的吗?
答案 0 :(得分:1)
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!