使用regex(Python)删除树中的叶子



我有一个语法树,以"LISP样式"保存在一个文本文件中,其中有显示关系的开括号和闭括号。我想删除所有的叶子。例如,我有"(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))))

这应该做到:

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"1", tree1)
print(tree2)

输出:

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

使用s*可能会更好,而不是在regex中只使用(空格)-这将允许在表示叶子的子字符串中有零个或多个空白字符(空格、制表符和换行符)的序列。

链接到在线Python repl

regex101.com 的链接

类似的东西?

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

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

有关unicode支持,请参阅下面的注释。

最新更新