我正在尝试计算包含递归括号表达式的正则表达式的出现次数。在我的特定情况下,我正在寻找按行或按文件计算出现次数(NP *) (VP *) (NP *)
。我的示例文件包含(第 4 行有一个递归情况):
$ more mini.example
<parse> (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) </parse>
<parse> (NP (NN opposition)) (XP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) </parse>
<parse> (NP (NN opposition)) (VP et) (NP gouvernement) (NP (NN opposition)) (VP et) (NP gouvernement) </parse>
<parse> (NP (NN opposition)) (VP et) (NP gouvernement (NP (NN opposition)) (VP et) (NP gouvernement)) </parse>
<parse> (NP (NN opposition)) (VP et) (FP gouvernement) (NP (NN opposition)) (RP et) (NP gouvernement) </parse>
<parse> (NP (NN opposition)) (VP et) </parse>
<parse> (VP et) (NP gouvernement) </parse>
我想要这样的输出:
3 1
2 2
2 3
2 4
0 5
0 6
我试过这个:
$ grep -Pon '(?<=\(NP ).*(?=\).*(?<=\(VP ).*(?=\).*(?<=\(NP ).*(?=\))))' mini.example | cut -d : -f 1 | uniq -c | sort -k 1
但输出是:
1 1
1 2
1 4
1 5
1 6
这与所需的不同。即使整个模式不匹配并且无法验证递归,它也会唯一地计算模式的第一部分。感谢您的任何帮助。
答案1
也许是这样的:
grep -nPo '(?=(\((?:[^()]++|(?1))*\)) (?=\(VP)(?1) (?=\(NP)(?1))\(NP' |
cut -d: -f1 | uniq -c
也就是说,它匹配 a ,(NP
前提是它是 a 的开头,(NP *) (VP *) (NP *)
我们对各部分使用 PCRE 递归匹配(...)
((\((?:[^()]++|(?1))*\))
直接的部分)来自 pcrepattern 手册页)。