我在一个纯文本文件中有24个考试,每个考试有50个MC问题以及其他一些东西。以下是我想要捕捉的一个例子:
1研究口述历史,考古证据和文化历史是最常用的方法 (1) 经济学家(3)哲学家 (2) 人类学家(4)政治学家
我想捕捉每个问题的词干和4个答案选择,或者至少是词干。
如何获取它以便正则表达式捕获从数字(问题编号)一直到第一个答案选择的第一个左括号(但不包括第一个答案选项的第一个左括号)的所有内容?
到目前为止,我有:\ d {1,2} \ s
答案 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)
形式)。