我希望从语法分析器的输出(名为Stanford Parser)中匹配一组特定的嵌套括号,如下所示。
(ROOT (S (NP (PRP He)) (VP (VBD gave) (NP (PRP me)) (NP (DT a) (NN pen))) (. .)))
(ROOT (S (NP (PRP He)) (VP (VBD said) (SBAR (IN that) (S (NP (PRP he)) (VP (VBD was) (ADJP (JJ hungry)))))) (. .)))
(ROOT (S (NP (PRP I)) (VP (VBD wrote) (NP (PRP him)) (NP (DT a) (JJ long) (NN letter))) (. .)))
(ROOT (S (NP (PRP He)) (VP (VBD provided) (NP (DT the) (JJ old) (NN bagger)) (NP (NP (DT a) (NN lot)) (PP (IN of) (NP (NN food))))) (. .)))
所以想要匹配(VP...)
中的所有内容。但有条件:
(1)之后应该有1 (VBD..)
和2 (NP..)
。 VBD
不是问题。(2)问题是两组NP
。 NP
括号的结构是不可预测的。唯一可预测的是NP
和嵌套括号,例如(NP bla bla bla )
。
所以我想捕获每个NP
,其中涉及将嵌套括号与NP
组合在一起。正则表达式匹配我想要的(至少在这个例子中),但它没有定义(NP bla bla bla )
部分。下面的半完整正则表达式不包含我寻求的这个解决方案,即包含所有递归括号子节点的NP部分。
\(VP\s+\(V\w+([^()]+|(?<Level>\()|(?<-Level>\)))+(?(Level)(?!))\)
有一些关于平衡组定义here的内容,它解释了嵌套括号,但它没有为我的问题提供解决方案。
答案 0 :(得分:0)
嗯,我不确定我真的明白你究竟想要什么,但我会试一试。 :)
\(VP.*\(V(\w{1,2}).*\(NP.*\){2}\)
这与您给出的示例和您想要的一个特殊情况匹配4次。
您可能需要查看regexpal.com以自行检查。
编辑: 我用了 。 (点)很多,你可能想要更严格一点。
答案 1 :(得分:0)
不,抱歉。正则表达式是非常有用的,但你要求的是它不能做的事情。正则表达式是一个“确定性有限自动机”,无法进行计数:https://en.wikipedia.org/wiki/Deterministic_finite_automaton
所以,你可能想要的是一个简单的递归下降解析器,它可以让你递归地匹配括号。它可能不像你花费的那样努力使正则表达式工作,特别是对于像你一样简单的语法。有关说明和示例,您可以从这里开始:https://en.wikipedia.org/wiki/Recursive_descent_parser
(嘿,你知道什么!那些计算机科学课程证明是有用的!)