1

これを読むために時間を割いてくれてありがとう。私はまだPerlにかなり慣れていないので、どんな助けでもありがたいです!

正規表現を使用して、大きなドキュメントの大きなセットからテキストを抽出しようとしています。

大きなドキュメントのどこから抽出を開始するかを識別するために使用する正規表現があります。この正規表現の条件は、正規表現に一致するインスタンスが複数存在する場合が多いというものです。これらの一致のどれが、抽出したいテキストの本文の始まりであるかを識別できます。(以下の例では、これは$finds[2]になります。

私がやりたいのは、。*?$ ENDを追加して同じ正規表現を再度実行し、$ENDが終了を識別するテキストを抽出することです。しかし、私が必要としているのは、$STARのN番目のオカレンスから抽出を開始するように正規表現に指示する方法です。

このことを考慮:

my $sentence = 'A1Z blah blah A2Z blah blah A3Z blah A4Z END A5Z';
my @finds = $sentence =~ m/(A\dZ)/mg;

####################
##  Code that determine the element of @finds that 
## contains the match to the extraction I want.
## For this question assume it is the third match (A3Z), 
## Element index number 2.
####################

$START = 2;

これが私の試みです:

my @finds2 = ($sentence =~ m/((A\dZ){$START}.*?(END))/mg);

my @finds2 = ($sentence =~ m/((A\dZ)[$START].*?(END))/mg);

{$START}または[$START]がPERLに、「$ START」番目の一致が発生するまで待機して抽出を開始し、一致を継続するように指示された場合は、それを希望します。

私の試みが正しくないことを私は知っています。うまくいけば、彼らは私がやろうとしていることを示すのに役立ちます。

4

1 に答える 1

3

これはあなたが好きなことをしますか?

my $pos = 3
my $END = "END";
my $a = "A1Z blah blah A2Z blah blah A3Z blah A4Z END A5Z";
$a =~ / (?:.*?A\dZ){$pos} (.*?) $END /x;
print $1, "\n" if defined $1;'
# prints " blah A4Z "

このコードは、A \ dZパターン(で指定された数)のn番目の出現を検索し、その後、$ENDのパターンが検出$posされるまでに保存を開始します。本当に$1パフォーマンスが必要な場合は、前の一致が残っていた場所と一致するアサーションを調べることをお勧めします。これは、組み込みのsoubroutineと混合できます。「バックトラック」を防ぐこともパフォーマンスを向上させることができますが、これは私があまり知らない高度なトピックです。\Gpos

推奨される読み物:「perlop-正規表現の引用のような演算子」、「perlre-アサーション」および「perldoc-fpos」。

(別の可能性は、入力をより小さな文字列に分割することかもしれませんが、多くの場合、最も単純なPerlソリューションも最適です。)

于 2012-07-12T21:20:21.677 に答える