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

时间:2015-03-28 10:53:46

标签: python regex tree nlp

我有一个语法树,保存在“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))))

2 个答案:

答案 0 :(得分:3)

这应该这样做:

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*而不仅仅是(空格)可能会更好 - 它将允许您在其中使用零个或多个空格字符(空格,制表符和换行符)的序列表示叶子的子串。

link to online Python repl

link to regex101.com

答案 1 :(得分:1)

这样的东西?

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

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

有关unicode支持,请参阅以下评论。