使用正则表达式删除树中的叶子 (Python)

Delete leaves in a tree with regex (Python)

我有一个语法树,保存在 "LISP-style" 中的文本文件中,用开括号和闭括号表示关系。我想删除所有叶子。例如,我有“(Det the)”,我想成为“Det”。我不是正则表达式专家,所以我想知道如何在更复杂的结构中使用嵌套括号来处理这种行为。树的示例(在我的文件中是一行,缩进只是为了更简单的可视化):

(S
  (NP I)
  (VP
    (VP (V shot) (NP (Det an) (N elephant)))
    (PP (P in) (NP (Det my) (N pajamas)))))

我想要这样的东西:

(S NP
  (VP
    (VP V (NP Det N))
    (PP P (NP Det N))))

是这样的吗?

re.sub("\((\w*) (\w*)\)", r"", t)

其中 t 是保存语法树的变量。

对于 unicode 支持,请参阅下面的评论。

应该这样做:

import re

tree1 = """(S
  (NP I)
  (VP
    (VP (V shot) (NP (Det an) (N elephant)))
    (PP (P in) (NP (Det my) (N pajamas)))))"""

tree2 = re.sub("\(\s*(\w+)\s*(\w+)\s*\)", r"", tree1)

print(tree2)

输出:

(S
  NP
  (VP
    (VP V (NP Det N))
    (PP P (NP Det N))))

在正则表达式中使用 \s* 而不是仅使用 (space) 可能会更好 - 它允许您拥有零或表示叶子的子字符串中有更多白色space 个字符(space、制表符和换行符)。

link to online Python repl

link to regex101.com