如何定义一个带字符串(句子)的函数,如果句点后面紧跟一个字母,则在一段时间后插入一个额外的空格。
sent = "This is a test.Start testing!"
def normal(sent):
list_of_words = sent.split()
...
这应该打印出来
“这是一个测试。开始测试!”
我想我应该使用split()
将字符串制成列表,但下一步是什么?
P.S。解决方案必须尽可能简单。
答案 0 :(得分:8)
使用re.sub
。您的正则表达式将匹配句点(\.
)后跟一个字母([a-zA-Z]
)。您的替换字符串将包含对第二组(\ 2)的引用,这是正则表达式中匹配的字母。
>>> import re
>>> re.sub(r'\.([a-zA-Z])', r'. \1', 'This is a test.This is a test. 4.5 balloons.')
'This is a test. This is a test. 4.5 balloons'
请注意正则表达式选择[a-zA-Z]
。这只匹配字母。我们不使用\w
因为它会在十进制数中插入空格。
答案 1 :(得分:3)
单行非正则表达式答案:
def normal(sent):
return ".".join(" " + s if i > 0 and s[0].isalpha() else s for i, s in enumerate(sent.split(".")))
这是一个使用类似方法的多行版本。您可能会发现它更具可读性。
def normal(sent):
sent = sent.split(".")
result = sent[:1]
for item in sent[1:]:
if item[0].isalpha():
item = " " + item
result.append(item)
return ".".join(result)
使用正则表达式可能是更好的方法。
答案 2 :(得分:1)
没有任何检查的蛮力:
>>> sent = "This is a test.Start testing!"
>>> k = sent.split('.')
>>> ". ".join(l)
'This is a test. Start testing!'
>>>
删除空格:
>>> sent = "This is a test. Start testing!"
>>> k = sent.split('.')
>>> l = [x.lstrip(' ') for x in k]
>>> ". ".join(l)
'This is a test. Start testing!'
>>>
答案 3 :(得分:1)
另一种基于正则表达式的解决方案可能比Steven快一点(只有一种模式匹配,黑名单而不是白名单):
import re
re.sub(r'\.([^\s])', r'. \1', some_string)
答案 4 :(得分:0)
改善pyfunc的答案:
sent =“这是一个测试。开始测试!”
K = sent.split( '')
K =”。 ”。加入(k)的
k.replace('。','。')
'这是一个测试。开始测试!'