2016-03-18 117 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