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

使用正则表达式(Python)删除树中的叶子,python,regex,tree,nlp,Python,Regex,Tree,Nlp,我有一个语法树,以“LISP风格”保存在一个文本文件中,带有显示关系的开括号和闭括号。我想删除所有的叶子。例如,我有“(Det the)”,我想成为“Det”。我不是正则表达式专家,所以我想知道如何在一个更复杂的结构中处理这种行为,用嵌套的括号。树的示例(在我的文件中是一行,缩进只是为了更简单的可视化): 我想要的是: (S NP (VP (VP V (NP Det N)) (PP P (NP Det N)))) 像这样的 re.sub("\((\w*) (\w*)\)",

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

我想要的是:

(S NP
  (VP
    (VP V (NP Det N))
    (PP P (NP Det N))))
像这样的

re.sub("\((\w*) (\w*)\)", r"\1", t)
其中t是保存语法树的变量

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

类似的内容

re.sub("\((\w*) (\w*)\)", r"\1", 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"\1", tree1)

print(tree2)
输出:

(S
  NP
  (VP
    (VP V (NP Det N))
    (PP P (NP Det N))))
在regex中使用
\s*
可能比只使用
(空格)更好-它允许在表示叶子的子字符串中有零个或多个空格字符(空格、制表符和换行符)的序列

这应该可以做到:

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))))
在regex中使用
\s*
可能比只使用
(空格)更好-它允许在表示叶子的子字符串中有零个或多个空格字符(空格、制表符和换行符)的序列


这正是我需要的!如果可能的话,我想请您提供更多帮助:我需要unicode字符的支持,我做了一个小测试,例如,“è”自然不会被\w检测到(这只是[a-z])。我如何处理这个问题?@Andrearonagnoli:请参阅Python
re
文档。如果有人需要现成的UNICODE版本,这里有一个解决方案:tree=re.sub(r“((\w*)(\w*))”,r“\1”,UNICODE(tree,'utf-8'),flags=re.UNICODE),这正是我需要的!如果可能的话,我想请您提供更多帮助:我需要unicode字符的支持,我做了一个小测试,例如,“è”自然不会被\w检测到(这只是[a-z])。我如何处理这个问题?@Andrearonagnoli:请参阅Python
re
文档。如果有人需要现成的UNICODE版本,这里有一个解决方案:tree=re.sub(r“((\w*)(\w*))”,r“\1”、UNICODE(tree,'utf-8')、flags=re.UNICODE)以及允许换行,
\s*
允许字符串中任意空格字符(简单空格、制表符、换行符等)的倍数,这也可能很方便。:)有关详细信息,请参见Python
re
文档中的
\s
项。好的,现在解释了
\s
*
的含义。除了允许换行符外,
\s*
还允许字符串中任意空格字符(简单空格、制表符、换行符等)的倍数,这也很方便。:)有关详细信息,请参见Python
re
文档中的
\s
条目。好的,现在解释
\s
*
的含义。