RegEx提取多项选择题

时间:2011-02-08 15:26:08

标签: regex

我在一个纯文本文件中有24个考试,每个考试有50个MC问题以及其他一些东西。以下是我想要捕捉的一个例子:

1研究口述历史,考古证据和文化历史是最常用的方法 (1) 经济学家(3)哲学家 (2) 人类学家(4)政治学家

我想捕捉每个问题的词干和4个答案选择,或者至少是词干。

如何获取它以便正则表达式捕获从数字(问题编号)一直到第一个答案选择的第一个左括号(但不包括第一个答案选项的第一个左括号)的所有内容?

到目前为止,我有:\ d {1,2} \ s

3 个答案:

答案 0 :(得分:0)

潜在的正则表达式:

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

说明:  ^(起始行)以1或2位数字和空格开头。将所有内容捕获到第一个括号。这是一个基本的正则表达式,并假设除了答案数字之外,问题中没有其他括号。这意味着它不适用于以下示例:

20我的问题(不是你的)有以下几个要素:(1)副词(2)代词(3)以上所有(4)以上都不是

答案 1 :(得分: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'
        ];

答案 2 :(得分:0)

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

我认为这将捕获整个问题和答案集,将答案分组(并在组内包括问题/答案数字)。 .*?表示*将是懒惰的,因此应该在使用下一个答案之前停止。

如果您只想提问题,可以使用lookahead

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

我应该提一下,这两个问题都允许问题/答案文本中的括号,只要它们不包含数字(即(1)形式)。