2016-03-18 86 views
1

我有一组以下形式的单词。 (journalistic (((journalism:stem)ist:suffix)ic:suffix))。我试图解析为以下形式m解析文本文件

root- journalistic 
    stem suffix suffix 
    stem - journalism 
    suffix -ic 
    suffix -ic 

的代码,我使用 从itertools导入takewhile

is_tab = '\('.__eq__ 

def build_tree(lines): 
    lines = iter(lines) 
    stack = [] 
    for line in lines: 
     indent = len(list(takewhile(is_tab, line))) 
     stack[indent:] = [line.lstrip()] 
     print (stack) 

source = ''' 
(journalistic (((journalism:stem)ist:suffix)ic:suffix))''' 

build_tree(source.split('\n')) 

它产生的输出:

[''] 
['(journalistic (((journalism:stem)ist:suffix)ic:suffix))'] 

的代码没有细分单词序列。 任何代码修复?

+2

您的代码不足以解析字符串下面的表格。 –

回答

1

我知道你正在寻找蟒蛇帮助,但你也可以写一个简单的Perl脚本,得到的输出。

#!/usr/bin/perl -w 

use strict; 
while(my $ln = <DATA>) { 
    chomp $ln; 
    my($root, $rest) = $ln =~ m/\((.*?)\s+(.*)\)$/; 
    print "Root - $root\n"; 
    if($rest) { 
    my @pairs = $rest =~ m/(\w+\:\w+)/g; 
    my @v; 
    my @a; 
    map {my ($k, $v) = split(/\:/, $_); push @v, $v; push @a, [$k, $v]} @pairs; 
    print "@v\n"; 
    map {print "$$_[1] - $$_[0]\n"} @a; 
    } 
    print "=====\n"; 
} 

__DATA__ 
(journalistic (((journalism:stem)ist:suffix)ic:suffix)) 

输出:

Root - journalistic 
stem suffix suffix 
stem - journalism 
suffix - ist 
suffix - ic 
===== 
1

pyparsing包括函数nestedExpr简化嵌套列表中的元素解析:

source = ''' 
(journalistic (((journalism:stem)ist:suffix)ic:suffix))''' 

from pyparsing import nestedExpr 

print nestedExpr().parseString(source)[0].asList() 

打印:

['journalistic', [[['journalism:stem'], 'ist:suffix'], 'ic:suffix']] 

编辑

你可以看到嵌套列表的内容使用以下代码:

parsed = nestedExpr().parseString(source)[0].asList() 
print (parsed[0]) # this looks like it would be the root 
print (parsed[1]) # will have to walk this recursively to extract the other bits 
print (parsed[1][0]) 

# how to walk the nested list recursively... 
def dump_tree(t, indent=''): 
    for s in t: 
     if isinstance(s, list): 
      dump_tree(s, indent + ' ') 
     else: 
      print (indent + '- ' + s) 
dump_tree(parsed) 

打印:

journalistic 
[[['journalism:stem'], 'ist:suffix'], 'ic:suffix'] 
[['journalism:stem'], 'ist:suffix'] 
- journalistic 
     - journalism:stem 
    - ist:suffix 
    - ic:suffix 
+0

它没有解析树。它只是改变了支架 – Karun

+0

再看一遍。 'asList()'返回的值不仅仅是一个字符串,其中'()'改为'[]'。它实际上是一个字符串和列表的嵌套列表。 – PaulMcG

+0

如何返回以下形式的东西? oot-新闻- 词尾后缀 词干 - 新闻 后缀-ic 后缀-ic – Karun