Python树中的正则表达式

时间:2015-03-23 18:00:38

标签: python regex

(ROOT
(S
(INTJ (UH Hello))
(, ,)
(NP (PRP$ My) (NN name))
(VP (VBZ is) (ADJP (JJ Melroy)))
(. .)))
(ROOT
(SBARQ
(WHNP (WP What))
(SQ (VBZ is) (NP (PRP$ your) (NN name)))
(. ?)))

我在python中有很多这些字符串。实际上它是一个树表示。我想为每个单词提取父节点和子节点。例如单词hello我想要(INTJ, UH)。类似地,对于单词My,它是(NP, PRP$)

这是我想要的结果:

(INTJ, UH) , (NP, PRP$), (NP, NN) , (VP, VBZ) , (VP , VPZ) , (ADJP, JJ) , (WHNP, WP), (SQ, VBZ), (NP, PRP$), (NP, NN)

有关如何操作的任何建议或暗示。?

1 个答案:

答案 0 :(得分:0)

这是一个输出你想要的代码。

在这段代码中,我逐行检查(BLAH(BLIH BLOH)),我删除(BLIH BLOH)并继续迭代直到找不到匹配。

astr = '''(ROOT
(S
(INTJ (UH Hello))
(, ,)
(NP (PRP$ My) (NN name))
(VP (VBZ is) (ADJP (JJ Melroy)))
(. .)))
(ROOT
(SBARQ
(WHNP (WP What))
(SQ (VBZ is) (NP (PRP$ your) (NN name)))
(. ?)))'''


def get_tree(astr):
    import re
    out = []
    lines = astr.splitlines()

    for line in lines:
        pat = '\(([^\(\)]+?)( \(([^\)\(]+?) [^\(\)]+?\)).*?\)'
        res = re.search(pat, line)
        while res:
            out.append((res.group(1), res.group(3)))
            line = line.replace(res.group(2),'')
            # line = re.sub('(\([^\s\(\)]*\))', '', line)
            res = re.search(pat, line)

    return out

get_tree(aster) # returns [('INTJ', 'UH'), ('NP', 'PRP$'), ('NP', 'NN'), ('VP', 'VBZ'), ('ADJP', 'JJ'), ('WHNP', 'WP'), ('SQ', 'VBZ'), ('NP', 'PRP$'), ('NP', 'NN')]