Python 如何删除以小写字母开头的句子?

Python 如何删除以小写字母开头的句子?,python,regex,perl,text,Python,Regex,Perl,Text,在下面的示例中,首先使用以下正则表达式(“.*”)删除所有对话。 下一步是删除所有以小写字母开头的剩余句子。 只应保留以大写字母开头的句子 例如: 韦德喊道。事实上,在他们下面是村庄,是用木材建造的简陋小屋 还有石头和泥。瓦砾砌成的墙,因为他们在这里几乎不需要避难所,还有 这些人不过是野蛮人 阿尔科特问道,他激动得有些压抑,声音有些不稳 莫雷回答说,他站在窗口,没有转身。现在在他们下面,, 在尼罗河流域不到半英里的地方,人们站着, 盯着看,一小群人聚在一起,向那个奇怪的东西做手势 那已经在他们头

在下面的示例中,首先使用以下正则表达式(“.*”)删除所有对话。 下一步是删除所有以小写字母开头的剩余句子。 只应保留以大写字母开头的句子

例如:

韦德喊道。事实上,在他们下面是村庄,是用木材建造的简陋小屋 还有石头和泥。瓦砾砌成的墙,因为他们在这里几乎不需要避难所,还有 这些人不过是野蛮人

阿尔科特问道,他激动得有些压抑,声音有些不稳

莫雷回答说,他站在窗口,没有转身。现在在他们下面,, 在尼罗河流域不到半英里的地方,人们站着, 盯着看,一小群人聚在一起,向那个奇怪的东西做手势 那已经在他们头顶的天空中出现了

在上述示例中,仅应删除以下内容:

韦德喊道。
阿尔科特问道,他的声音因为抑制住了激动而有点不稳定。
莫雷回答说,他站在窗口,没有转身

欢迎使用有用的正则表达式或简单的Perl或python代码。我正在使用Textpipe的第7版


谢谢。

这应该适用于您发布的示例:

text = re.sub(r'(^|(?<=[.!?])\s+)[a-z].*?[.!?](?=\s|$)', r'\1', text)

text=re.sub(r'(^ |)(?这应该适用于您发布的示例:

text = re.sub(r'(^|(?<=[.!?])\s+)[a-z].*?[.!?](?=\s|$)', r'\1', text)

text=re.sub(r'(^ |)(?这在Perl中对您的示例非常有用:

$s = "exclaimed Wade. Indeed, ...";

do {
  $prev = $s;
  $s =~ s/(^\s*|[.!?]\s+)[a-z][^.!?]*[.!?]\s*/$1/gs;
} until ($s eq $prev);
没有do循环,它很难删除多个连续的句子

请注意,完美地做到这一点非常重要。 请参见此问题,以了解您永远不会正确理解的句子类型的示例:


当然,您可以使用LaTeX的启发式方法来确定什么是句子结束句点,并在大多数情况下都正确无误。

这在Perl中对您的示例非常有用:

$s = "exclaimed Wade. Indeed, ...";

do {
  $prev = $s;
  $s =~ s/(^\s*|[.!?]\s+)[a-z][^.!?]*[.!?]\s*/$1/gs;
} until ($s eq $prev);
没有do循环,它很难删除多个连续的句子

请注意,完美地做到这一点非常重要。 请参见此问题,以了解您永远不会正确理解的句子类型的示例:

当然,你可以使用LaTeX的启发式方法来确定什么是句子结束时间,并且在大多数情况下都能做到正确。

为什么不使用这样的模块呢?这样可以很容易地从任意英文文本中获得非常好的句子

#!perl

use strict;
use warnings;

use Lingua::EN::Sentence qw( get_sentences );

my $text = <<END;

exclaimed Wade. Indeed, below them were villages, of crude huts made of timber and stone and mud. Rubble work walls, for they needed little shelter here, and the people were but savages.

asked Arcot, his voice a bit unsteady with suppressed excitement.

replied Morey without turning from his station at the window. Below them now, less than half a mile down on the patchwork of the Nile valley, men were standing, staring up, collecting in little groups, gesticulating toward the strange thing that had materialized in the air above them.
END


my $sentences = matching_sentences( qr/^[^a-z]/, $text );

print map "$_\n", @$sentences;

sub matching_sentences {
    my $re   = shift;
    my $text = shift;

    my $s = get_sentences( $text );

    @$s = grep /$re/, @$s;

    return $s;
}
为什么不使用这样的模块呢?它可以很容易地从任意的英语文本中获得非常好的句子

#!perl

use strict;
use warnings;

use Lingua::EN::Sentence qw( get_sentences );

my $text = <<END;

exclaimed Wade. Indeed, below them were villages, of crude huts made of timber and stone and mud. Rubble work walls, for they needed little shelter here, and the people were but savages.

asked Arcot, his voice a bit unsteady with suppressed excitement.

replied Morey without turning from his station at the window. Below them now, less than half a mile down on the patchwork of the Nile valley, men were standing, staring up, collecting in little groups, gesticulating toward the strange thing that had materialized in the air above them.
END


my $sentences = matching_sentences( qr/^[^a-z]/, $text );

print map "$_\n", @$sentences;

sub matching_sentences {
    my $re   = shift;
    my $text = shift;

    my $s = get_sentences( $text );

    @$s = grep /$re/, @$s;

    return $s;
}

这可能会对包含例如“foo.com”的句子产生问题。可靠地检测句子结尾并不容易。我们做了我们能做的,而且通常已经足够好了(例如,它对问题中的示例有效)。但是,我在句号/问号/感叹号之后添加了空格/行尾的要求。对于包含例如“foo.com”的句子,这可能会有问题。可靠地检测句子的结尾并不容易。我们尽我们所能,而且通常已经足够好了(例如,它适用于问题中的示例)。但是,我在句号/问号/感叹号后添加了空格/行尾的要求。具有讽刺意味的是,这对包含句号的句子不起作用。我不明白。我确实用包含字符串(如“abc.def”)的句子进行了测试,结果是有效的。可以说,当一个句子包含“abc.def”时,我的代码做了错误的事情。(但这可能取决于语料库,这更可能是一个词内句点还是一个句子结尾句点。)或者你是指带有句点的句子,比如“I love E.B.White.”?这很难理解。讽刺的是,这对包含句点的句子不起作用。我不明白。我确实用包含字符串的句子,比如“abc.def”来测试过它可以说,当一个句子包含“abc.Def”时,我的代码做了错误的事情。(但可能这取决于语料库,它更可能是一个词内句点还是一个句子结束句点。)或者你指的是像“我爱E.B.怀特”这样的句点的句子吗?这很难。事实上,没有正则表达式这样的东西可以匹配“一个句子”。实际上,没有任何正则表达式与“一个句子”匹配。