用单个句号替换多个句号

Posted

技术标签:

【中文标题】用单个句号替换多个句号【英文标题】:Replace multiple fullstops with single fullstop 【发布时间】:2016-03-10 07:44:18 【问题描述】:

如何,以便 NLTK 句子标记器可以将它们区分为 2 个不同的句子

例如

a = "the food was good...what about the bread huh..Awesome"

如果我使用

nltk.sent_tokenize(a)

它给了我

['the food was good...what about the bread huh..Awesome']

但我想要的是

['the food was good.', 'what about the bread huh.', 'Awesome']

我该怎么做?

【问题讨论】:

您是否检查过省略号几乎总是在您的语料库中结束一个句子?因为情况并非总是如此:“这……很有趣”。 【参考方案1】:

您可以通过使用regex and substitute 来做到这一点,多个点的出现只有一个,如下所示:

#!/usr/bin/env python3
# coding: utf-8

import re

a = "the food was good...what about the bread huh..Awesome"
a_replaced = re.sub(r'\.+', ".", a)

给你:

'the food was good.what about the bread huh.Awesome'

此外,我将向您简要说明其工作原理。 re.sub() 接受应替换的 regex 模式。在我们的例子中,这是r'\.+'

让我们更深入地了解一下这种模式。由于您正在寻找点.,我们需要抓住它们。但是,通常点号. 在正则表达式中用于匹配任何我们不想实现的字符。为了匹配点 . 而不是任何字符,我们需要通过在点前面添加反斜杠来转义这个字符,从而给出\.

由于我们想要找到任何出现的点并且我们不知道会有多少个点,我们只是在寻找“一个或多个”,我们通过将+ 附加到我们的匹配组/. 来实现.

我们有一个工作正则表达式:/.+,我们将其传递为r'\.+',以向 Python 表明这是一个正则表达式而不是普通字符串。接下来,如re.sub() docs 中所述,我们需要指定一个要放置的字符串,而不是我们的正则表达式模式。这只是一个点".",因为您想用一个点替换几个点。我们传递的第三个参数是您的字符串a,我们需要在其中进行所需的替换。

我不想宣传任何东西,但为了快速了解 Python 中的正则表达式,我可以建议 this cheat sheet。

【讨论】:

【参考方案2】:

您也可以为此目的使用re.split。它也会返回一个列表

a="the food was good...what about the bread huh..Awesome"
sr = re.split("\.+", a)
print sr

你得到

['the food was good', 'what about the bread huh', 'Awesome']

干杯!

【讨论】:

坏主意:句子标记器之所以存在是因为句号总是结束一个句子。但是您可以使用split() 将其拆分为三个句点,然后将每个片段句子标记为更多句子。

以上是关于用单个句号替换多个句号的主要内容,如果未能解决你的问题,请参考以下文章

python批量给word文末添加句号

如何从亚马逊红移中的字符串中删除非数字字符(句号“。”除外)

java怎么以空格,英文逗号和句号拆分一个字符串,一个逗号我会,同时三个该怎么写

求sql部分字符替换语句

替换打字稿中字符串中的所有字符实例?

中间的句号怎么打