2 Stimmen

RegEx zum Extrahieren von Multiple-Choice-Fragen

Ich habe 24 Prüfungen in einer reinen Textdatei mit jeweils 50 MC-Fragen und einem Haufen anderer Dinge. Hier ist ein Beispiel dafür, was ich zu erfassen versuche:

1 Mündliche Überlieferungen, archäologische Funde und kulturgeschichtliche Untersuchungen sind die am häufigsten verwendeten Methoden der (1) Wirtschaftswissenschaftlern (3) Philosophen (2) Anthropologen (4) Politikwissenschaftlern

Ich würde gerne den Wortlaut und die 4 Antwortmöglichkeiten für jede Frage erfassen, oder zumindest nur die Wortlaute.

Wie schaffe ich es, dass die Regex alles von der Ziffer (Fragennummer) bis hin zur ersten offenen Klammer der ersten Antwortmöglichkeit erfasst, aber nicht einschließt?

Bis jetzt habe ich das: \d {1,2} \s

0voto

Derek Downey Punkte 1492

Potenzielle Regex:

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

E ^ (Anfangszeile), die mit 1 oder 2 Ziffern und einem Leerzeichen beginnt. Erfassen Sie alles bis zur ersten Klammer. Dies ist eine einfache Regex, die davon ausgeht, dass außer den Antwortnummern keine weiteren Klammern in der Frage vorhanden sind. Das bedeutet, dass sie für das folgende Beispiel nicht funktionieren wird:

20 Meine Frage (nicht Ihre) hat folgende Elemente: (1) Adverb (2) Pronomen (3) alle oben genannten (4) keines der oben genannten

0voto

Toto Punkte 85935

Hier ist ein Perl-Skript, das diese Aufgabe übernimmt:

#!/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;

sortie :

Studying oral histories, archaeological evidence (of course), and cultural histories are methods most often used by
$VAR1 = [
          ' economists',
          ' philosophers',
          ' anthropologists',
          ' political scientists'
        ];

0voto

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

Ich denke, dass damit der gesamte Fragen- und Antwortsatz erfasst wird, wobei die Antworten gruppiert werden (und die Frage-/Antwortnummern innerhalb der Gruppen enthalten sind). Die .*? bedeutet die * träge sein, so dass es vor der nächsten Antwort aufhören sollte.

Wenn Sie nur die Frage wollen, können Sie eine Vorausschauende Betrachtung :

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

Ich sollte erwähnen, dass in beiden Fällen Klammern innerhalb des Frage-/Antwort-Textes zulässig sind, solange sie nicht nur eine Zahl enthalten (d. h. (1) Form).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X