我正在编写一些代码,这些代码将一组句子标准化为语法正确,这意味着如果标点符号与之前的单词之间有空格,则会删除等等。如果这是输入的字符串:< / p>&#xA;&#xA;
您好!我的名字是Bob,很高兴认识你!&#xA;
&#xA;&#xA; 这将浓缩为:
&#xA; &#XA;<代码>你好!我的名字是Bob,很高兴认识你!&#xA;&#xA;&#xA;
问题来自于语音标记,它们不仅仅停留在最后它的左边是这个词。例如,
&#xA;&#xA; Bob说“这很有趣!”&#xA;
&#xA;&#xA; < p>不会压缩为:&#xA;&#xA; Bob说“这很有趣!”&#xA;
&#xA; &#xA; 简单地说,当使用语音时,第一个语音标记贴在单词的右边,第二个语音标记贴在单词的左边。
&#xA;&#xA;考虑到这一点之后,我将以下代码放在一起:
&#xA;&#xA; import re&#xA;&#xA; sentence = input(“输入一个字符串“)&#xA;句子=(re.sub(r'\ s +([?。,!:;])',r'\ 1',句子))&#xA; space_sentence = re.findall('” [^“] * | [^”] +',句子)&#xA;&#xA;对于i in(0,(len(space_sentence)-1)):&#xA; if space_sentence [i-1]和space_sentence [i + 1] =='“':&#xA; re.sub(r'\ s +','',space_sentence [i])&#xA;&#xA;&#xA; output =(''。join(space_sentence))&#xA; print(output)& #xA;
&#xA;&#xA; 这个的基本思想是它将通过字符串并在找到语音标记之前和之后将其拆分。
&#xA;&#xA;例如
&#xA;&#xA; 鲍勃在离开之前说“我喜欢鱼”。&#xA; < / code>
&#xA;&#xA; 将成为
&#xA;&#xA; ['Bob说',''','我喜欢鱼',''','走开之前'。'&#xA;
&#xA;&#xA; 然后我可以做的是检查是否有任何东西列表在删除空格之前的任一侧都有一个语音标记,然后将它们全部重新组合在一起,因此只删除语音标记和语音之间的空格。
&#xA;&#xA ; 鲍勃在走开之前说“我喜欢鱼”。&#xA;
&#xA;&#xA; 问题是我找到了它在语音标记之前和之后难以切割(我给出的代码之前只会删除)因此我想问一下是否有一种简单的方法可以做到这一点?也可以随意纠正我在其他地方犯过的任何错误。
&#xA;&#xA;对不起,如果我的代码目前非常混乱,我不是编码专家哈哈:)
&#xA;&#xA;感谢您的帮助!
&#xA;答案 0 :(得分:0)
两对之间的非贪婪匹配将起作用:
import re
s = 'He said , " This is fun ! " She said , " No it is not . "'
s = re.sub(r'\s+([?.,!:;])', r'\1', s)
print(s)
s = re.sub(r'"\s+(.*?)\s+"', r'"\1"', s)
print(s)
输出:
He said, " This is fun! " She said, " No it is not. "
He said, "This is fun!" She said, "No it is not."