2011-02-08 17 views
2

私は50のMC質問とそれぞれの他のものの束を含むプレーンテキストファイルで24の試験を持っています。ここで私は捕獲しようとしているものの例である:経口歴史、考古学的な証拠、および文化的な歴史を勉強複数の選択肢の質問を抽出するRegEx

1は、最も頻繁に (1) 経済学者(3)哲学者 (2) で使用される方法です人類学者(4)政治学者

私は、各質問、または少なくとも茎だけで、幹と4つの回答の選択肢を取りたいと思います。

正規表現は最初の答えの選択肢の最初の開いている括弧までのすべての数字(質問番号)からすべてをキャプチャするようにするにはどうすればよいですか?

はこれまでのところ、私は:\ D {1,2} \ S

+0

どのプログラミング言語ですか? – Sjoerd

+0

どのプログラミング言語ですか? –

+1

@Sjoerd:jinx ;-) –

答えて

0

潜在的な正規表現:

^\d{1,2}\s([^\(]*) 

説明: ^(開始ライン)1又は2桁の数字で始まりスペース。最初のかっこまですべてをキャプチャします。これは基本的な正規表現であり、回答番号以外の質問には他の括弧がないと仮定しています。それは、次の例では動作しません意味:

20私の質問(ないあなたの)次の要素があります:(1)副詞(2)代名詞(3)上記の上記(4)なしのすべてここで

0

は、仕事をするPerlスクリプトです:

#!/usr/bin/perl 
use 5.10.1; 
use strict; 
use warnings; 
use Data::Dumper; 

my $str = q/1 Studying oral histories, archaeological evidence (of course), and cultural histories are methods most often used by (1) economists (3) philosophers (2) anthropologists (4) political scientists/; 

my ($question, @answers) = $str =~ /^\d+ (.*?) (?:\(\d\))(.*?) (?:\(\d\))(.*?) (?:\(\d\))(.*?) (?:\(\d\))(.*?)$/; 
say $question; 
say Dumper \@answers; 

は出力:

Studying oral histories, archaeological evidence (of course), and cultural histories are methods most often used by 
$VAR1 = [ 
      ' economists', 
      ' philosophers', 
      ' anthropologists', 
      ' political scientists' 
     ]; 
0
^(\d{1,2}\s.*?)(\(\d{1,2}\)\s.*?)+$ 

質問と回答のセット全体をキャプチャし、回答をグループ化します(グループ内の質問/回答番号を含む)。 .*?は、*が遅延していることを意味しますので、次の応答を使用する前に停止する必要があります。

あなただけの質問をしたい場合は、lookaheadを使用することができます。

^(\d{1,2}\s.*?)(?=\s\(\d{1,2}\)) 

私は、これらの両方がいる限り、彼らはちょうど含まれていないとして、質問/回答テキスト内の括弧を可能にすることを言及する必要があります番号(すなわち、(1)形式)。

+0

私はグループ内の数字を含めることを選択しましたが、それは変更できます。あなたがそれらを省略したいと思ったら教えてください。 –

関連する問題