如何使用Perl regEx计算句子?

时间:2011-04-14 17:40:11

标签: regex perl io

我从一开始就出于某种原因在Perl中遇到了regExp,并且我在这里编写了一个快速脚本来计算输入的某些文本中的句子,这些句子无效。我只是在最后得到了数字1,我​​知道在指定的文件中有几个所以计数应该更高。我看不出这个问题......

#!C:\strawberry\perl\bin\perl.exe

#strict
#diagnostics
#warnings

$count = 0;
$file = "c:/programs/lorem.txt";

open(IN, "<$file") || die "Sorry, the file failed to open: $!";


while($line = <IN>)
{     
    if($line =~ m/^[A-Z]/)
    {
    $count++;
    }
}

close(IN);

print("Sentances count was: ($count)");

文件lorem.txt在这里......

Lorem ipsum dolor坐下来,这是一种不可或缺的精神。 Aenean commodo ligula eget dolor。 Aenean massa。 Cum sociis natoque penatibus et magnis dis parturient montes,nascetur ridiculus mus。 Donec quam felis,ultricies nec,pellentesque eu,pretium quis,sem。 Nulla consequat massa quis enim。 Donec pede justo,fringilla vel,aliquet nec,vulputate eget,arcu。在enim justo,rhoncus ut,imperdiet a,venenatis vitae,justo。 Nullam dictum felis eu pede mollis pretium。整数tincidunt。 Cras dapibus。 Vivamus elementum semper nisi。 Aenean vulputate eleifend tellus。 Aenean leo ligula,porttitor eu,consequat vitae,eleifend ac,enim。 Aliquam lorem ante,dapibus in in,viverra quis,feugiat a,tellus。菜豆(Phasellus viverra nulla ut metus varius laoreet)。 Quisque rutrum。 Aenean imperdiet。 Etiam ultricies nisi vel augue。 Curabitur ullamcorper ultricies nisi。 Nam eget dui。 Etiam rhoncus。 Maecenas tempus,tellus eget condimentum rhoncus,sem quam semper libero,sit amet adipiscing sem neque sed ipsum。 Nam quam nunc,blandit vel,luctus pulvinar,hendrerit id,lorem。 Maecenas nec odio et ante tincidunt tempus。 Donec vitae sapien ut libero venenatis faucibus。 Nullam quis ante。 Etiam坐在amet orci eget eros faucibus tincidunt。杜伊斯利奥。 Sed fringilla mauris坐在amet nibh。 Donec sodales sagittis magna。 Sed consequat,leo eget bibendum sodales,augue velit cursus nunc,

3 个答案:

答案 0 :(得分:2)

我不知道你lorem.txt中的内容是什么,但你提供的代码不包括句子。它正在计算,而且还计算以大写字母开头的行。

这个正则表达式:

/^[A-Z]/

只会在一行的开头匹配,并且只有当该行的第一个字符大写时才会匹配。因此,如果您的某行看起来像it. And then we went...,则匹配。

如果您想匹配所有大写字母,只需从正则表达式的开头删除^

答案 1 :(得分:2)

这不能回答您关于regexp的具体问题,但您可以考虑使用CPAN模块:Text::Sentence。您可以查看其源代码,了解它如何定义句子。

use warnings;
use strict;
use Data::Dumper;
use Text::Sentence qw(split_sentences);

my $text = <<EOF;
One sentence.  Here is another.
And yet another.
EOF

my @sentences = split_sentences($text);
print Dumper(\@sentences);

__END__

$VAR1 = [
          'One sentence.',
          'Here is another.',
          'And yet another.'
        ];

谷歌搜索也出现了:Lingua::EN::Sentence

答案 2 :(得分:1)

您目前正在计算所有以大写字母开头的行。也许你打算算一下以大写字母开头的所有单词?如果是这样,请尝试:

m/\W[A-Z]/

(虽然这不是一个强有力的句子数)

另一方面,没有必要明确地进行文件操作。 perl为你做了很好的工作。试试这个:


$ARGV[ 0 ] = "c:/programs/lorem.txt" unless @ARGV;
while( $line = <> ) {
...

如果你坚持做一个明确的打开/关闭,那么使用原始文件句柄被认为是不好的做法。换句话说,不要“打开IN ...”,而是“打开我的$ fh,'&lt;',$ file_name;”