Возможно, регулярное выражение - не лучший способ разобрать это, скажите мне, если это не так. В любом случае, вот несколько примеров того, как выглядит синтаксическое дерево:
(S (CC and))
(SBARTMP (IN once) (NP otherstuff))
(S (S (NP blah (VP blah)) (CC then) (NP blah (VP blah (PP blah))) ))
В любом случае, я пытаюсь вытянуть соединительный элемент (и затем один раз и т. Д.) И соответствующий ему заголовок (CC, IN, CC), который я уже знаю для каждого синтаксического дерева, чтобы он мог действовать как якорь, и мне также нужно получить его родителя (в первом это S, второй SBARTMP и третий это S), и его братьев и сестер, если таковые имеются (в первом нет, во втором левом родном брате и третий левый и правый братья и сестры). Все, что выше, чем родитель, не входит
my $pos = "(\\\w|-)*";
my $sibling = qr{\s*(\\((?:(?>[^()]+)|(?1))*\\))\s*};
my $connective = "once";
my $re = qr{(\(\w*\s*$sibling*\s*\\(IN\s$connective\\)\s*$sibling*\s*\))};
Этот код работает для таких вещей, как:
my $test1 = "(X (SBAR-TMP (IN once) (S sdf) (S sdf)))";
my $test2 = "(X (SBAR-TMP (IN once))";
my $test3 = "(X (SBAR-TMP (IN once) (X as))";
my $test4 = "(X (SBAR-TMP (X adsf) (IN once))";
Он выбросит X сверху и сохранит все остальное, однако, как только у братьев и сестер есть материал, встроенный в них, он не совпадает, потому что регулярное выражение не углубляется.
my $test = "(X (SBAR-TMP (IN once) (MORE stuff (MORE stuff))))";
Я не уверен, как объяснить это. Я новичок в расширенных шаблонах для Perl, только начал изучать его. Чтобы немного прояснить, что делает регулярное выражение: он ищет связующее в двух скобках и заглавную букву / -, ищет полный родительский элемент того же формата, закрывающийся двумя круглыми скобками, а затем должен искать любое количество братьев и сестер. с парными скобками.