#regex #perl #io
#регулярное выражение #perl #io
Вопрос:
По какой-то причине у меня с самого начала возникали проблемы с регулярным выражением в Perl, и у меня есть написанный здесь быстрый скрипт для подсчета предложений в некотором вводимом тексте, который не будет работать. Я просто возвращаю цифру 1 в конце, и я знаю, что в указанном файле их несколько, поэтому количество должно быть больше. Я не вижу проблемы…
#!C:strawberryperlbinperl.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 sit amet, consectetuer adipiscing elit. 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. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer 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, 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 sit amet orci eget eros faucibus tincidunt. Duis leo. Sed fringilla mauris sit amet nibh. Donec sodales sagittis magna. Sed consequat, leo eget bibendum sodales, augue velit cursus nunc,
Комментарии:
1. Вы предполагаете, что каждая строка является предложением? Я думаю, что ваше регулярное выражение должно быть немного более широким, если вы считаете предложения.
2. Нам нужно увидеть хотя бы пару строк из вашего файла, которые, по вашему мнению, следует подсчитать…
3. Кроме того, я не так хорошо знаком с регулярным выражением perl, но это работает с моими тестами (хотя и примитивно, оно находит предложения, затем вам просто нужно посчитать совпадения)
[A-Z].*?[.!?]s*(?=[A-Z]|[rn] |$)
[использование глобального флага]4.
strict
,diagnostics
иwarnings
не помогают, если они не записаны какuse strict;
, и тогда либоuse diagnostics;
, либоuse warnings;
Ответ №1:
Я не знаю, что в вашем lorem.txt
, но приведенный вами код не учитывает предложения. Оно подсчитывает строки, и более того, оно подсчитывает строки, начинающиеся с заглавной буквы.
Это регулярное выражение:
/^[A-Z]/
будет совпадать только в начале строки и только в том случае, если первый символ в этой строке написан с заглавной буквы. Итак, если у вас есть строка, которая выглядит так, что it. And then we went...
она не будет сопоставлена.
Если вы хотите сопоставить все заглавные буквы, просто удалите ^
из начала регулярного выражения.
Ответ №2:
Это не отвечает на ваш конкретный вопрос о регулярном выражении, но вы могли бы рассмотреть возможность использования модуля 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.'
];
Также появился поиск в Google: Lingua::EN::Sentence
Ответ №3:
В данный момент вы подсчитываете все строки, начинающиеся с заглавной буквы. Возможно, вы намерены подсчитать все слова, начинающиеся с заглавной буквы? Если да, попробуйте:
m / W[A-Z]/
(Хотя это ненадежное количество предложений)
С другой стороны, нет необходимости явно выполнять манипуляции с файлом. perl действительно хорошо справляется с этой задачей для вас. Попробуйте это:
$ARGV[ 0 ] = "c:/programs/lorem.txt " если только @ARGV; while( $line = <> ) { ...
Если вы настаиваете на выполнении явного открытия / закрытия, использование необработанных дескрипторов файлов считается плохой практикой. Другими словами, вместо «открыть В …», сделайте «открыть мой $ fh, ‘<‘, $file_name;»