1

私は HTML:Parser が重要であることを知っており、読み回してみると、正規表現を使用して html を解析しようとするのは、通常、次善の方法であることに気付きましたが、Perl クラスでは現在、正規表現を使用しようとしています (できれば保存された html ドキュメントから文を識別して保存します。最終的には、文の数、単語/文、およびできればページ上の単語の平均長を計算できるようにしたいと考えています。

今のところ、">" に続き ". " の前にあるものを分離しようとしましたが、それが分離するものを確認するだけですが、正規表現を操作してもコードを実行できません。したがって、問題が正規表現にあるのか、他の場所にあるのか、その両方にあるのかはわかりません。どんな助けでも大歓迎です!

#!/usr/bin/perl
#new
use CGI qw(:standard);
print header;

open FILE, "< sample.html ";
$html = join('', <FILE>);
close FILE;

print "<pre>";

###Main Program###
&sentences;

###sentence identifier sub###

sub sentences {
@sentences;
while ($html =~ />[^<]\. /gis) {
    push @sentences, $1;
}
#for debugging, comment out when running    
    print join("\n",@sentences);
}

print "</pre>";
4

3 に答える 3

3

あなたの正規表現は/>[^<]*?./gis

手段は*?0 個以上の非貪欲に一致します。現状では、正規表現は単一の非 < 文字とそれに続くピリオドとスペースのみに一致します。このようにして、最初のピリオドまで < 以外のすべてに一致します。

他の問題があるかもしれません。

今これを読んで

于 2013-05-22T06:18:46.180 に答える
2

最初の改善点は、 を書く$html =~ />([^<.]+)\. /gsことです。親との一致をキャプチャする必要があり、文ごとに 1 文字以上を許可する必要があります ;--)

ただし、これはすべての文を取得するわけではなく、各要素の最初の文だけを取得します。

より良い方法は、すべてのテキストをキャプチャしてから、各フラグメントから文を抽出することです

while( $html=~ m{>([^<]*<}g) { push @text_content, $1}; 
foreach (@text_content) { while( m{([^.]*)\.}gs) { push @sentences, $1; } }

(朝早くてコーヒーが鳴っているので未確認)

正規表現を使用して HTML を解析する際の通常の警告がすべて適用されますが、最も顕著なのはテキスト内の '>' の存在です。

于 2013-05-22T06:22:29.027 に答える