【问题标题】:Delete leaves in a tree with regex (Python)使用正则表达式删除树中的叶子(Python)
【发布时间】:2015-03-28 10:53:46
【问题描述】:

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

【问题讨论】:

    标签: python regex tree nlp


    【解决方案1】:

    应该这样做:

    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

    【讨论】:

    • 除了允许换行符之外,\s* 还允许字符串中任意多个空白字符(简单的空格、制表符、换行符等),这也可能派上用场。 :) 有关详细信息,请参阅 Python re 文档中 Regular Expression Syntax 下的 \s 条目。
    • 好的,现在解释\s*的含义。
    【解决方案2】:

    这样的?

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

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

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

    【讨论】:

    • 这正是我所需要的!如果可能的话,我会向您寻求更多帮助:我需要支持 unicode 字符,我做了一些测试,例如 \w 自然不会检测到“è”(那只是 [a-z])。我该怎么办?
    • @AndreaRomagnoli:请参阅 Python re 文档中的 re.UNICODE
    • 如果有人需要开箱即用的 UNICODE 版本,解决方案如下: tree = re.sub( r"((\w*) (\w*)) ", r"\1", unicode( tree, 'utf-8' ), flags=re.UNICODE )
    猜你喜欢
    • 2019-02-16
    • 2019-08-20
    • 1970-01-01
    • 2020-09-03
    • 2011-05-13
    • 1970-01-01
    • 2012-02-22
    • 2014-06-25
    • 2011-12-23
    相关资源
    最近更新 更多