使用正则表达式删除树中的叶子 (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、制表符和换行符)。
我有一个语法树,保存在 "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、制表符和换行符)。