使用正则表达式(Python)删除树中的叶子
我有一个语法树,以“LISP风格”保存在一个文本文件中,带有显示关系的开括号和闭括号。我想删除所有的叶子。例如,我有“(Det the)”,我想成为“Det”。我不是正则表达式专家,所以我想知道如何在一个更复杂的结构中处理这种行为,用嵌套的括号。树的示例(在我的文件中是一行,缩进只是为了更简单的可视化): 我想要的是:使用正则表达式(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*)\)",
(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:请参阅Pythonre
文档。如果有人需要现成的UNICODE版本,这里有一个解决方案:tree=re.sub(r“((\w*)(\w*))”,r“\1”、UNICODE(tree,'utf-8')、flags=re.UNICODE)以及允许换行,\s*
允许字符串中任意空格字符(简单空格、制表符、换行符等)的倍数,这也可能很方便。:)有关详细信息,请参见Pythonre
文档中的\s
项。好的,现在解释了\s
和*
的含义。除了允许换行符外,\s*
还允许字符串中任意空格字符(简单空格、制表符、换行符等)的倍数,这也很方便。:)有关详细信息,请参见Pythonre
文档中的\s
条目。好的,现在解释\s
和*
的含义。