2014-11-14 103 views
0

所以,我有像下面的任一束線(生產):如何拆分線的某些部分?

VBD -> 'RATTLED' 
PP -> CC PP|<PP-LOC-CC-PP> 

總是有在LHS一個部分,然後沿箭頭然後在RHS一個或兩個部分。我如何儲存它們或給他們打電話? (例如遍歷所有行(產品)並檢查LHS是VBD還是RHS是RATTLED(對於第一種模式)或者RHS0是CC並且RHS1是PP-PP | (對於第二種模式)) ?

再次,在製作圖案總是遵循以下之一:

A -> 'B' 

C -> D E 

A,B,C,d和E可以是任何東西(數字,字母標誌等)

回答

2

如果你想要將每條線分成頭部(例如VBD)和尾部(例如'RATTLED'),一個簡單的方法就是使用th Èsplit操作者像這樣:

for line in lines: 
    split_line = line.split(" -> ") 
    head = split_line[0] 
    tail = split_line[1] 

這假定每一行只有一個的發生率「 - >」,並且每個線對的各側的空間「 - >」分隔符。

我不知道我理解你實現的細節,但如果你想檢查任何給定的尾巴是否像'RATTLED'或類似CC PP|<PP-LOC-CC-PP>,你可以像這樣通過遍歷尾巴:

for token in tail: 
    if token[0] == "'": 
     # this is a string, like 'B' 
    else: 
     # this is like D E etc. 
     two_part_style_split = token.split(' ') 

two_part_style_split看起來像這樣:

['CC', 'PP<PP-LOC-CC-PP>'] 
+0

它不會趕上RHS的兩個部分在第二圖案! – sabzdarsabz 2014-11-14 20:39:10

+0

@sabzdarsabz好吧,我認爲可能是LHS和RHS,你的意思是「左手邊」和「右手邊」?這對我來說有點令人困惑,我不確定人們會立即得到這些信息,特別是考慮到你解析的文本如何非常密集和混亂。 – furkle 2014-11-14 20:41:40

+1

@sabzdarsabz我假設你的意思是「兩部分」是指由管道分開的兩部分?如果是這樣,我已經更新了它,以便它可以工作。 – furkle 2014-11-14 20:48:38

0

您可以使用正則表達式來分解零件。我在第二步中刪除了空格以防止正則表達式看起來太糟糕。

import re 

tests = ["VBD -> 'RATTLED'", "PP -> CC PP|<PP-LOC-CC-PP>"] 

# use positive lookahead to find everything before ->, 
# then everything between -> and (optional) | 
# and everything after | 
split_re = re.compile(r"(.*(?=->))->([^|]+)\|?(.*)?") 

def parse(txt): 
    # pull out the values then strip any surrounding whitespace 
    return (t.strip() for t in split_re.match(txt).groups()) 

for test in tests: 
    a, b, c = parse(test) 
    print a,b,c 

一個更復雜的正則表達式可以讓你跳過一個單獨的步驟剝離值,在可讀性的損失:

split_re = re.compile(r"\s*(.*(?=\s*->))\s*->\s*(.*(?=\s*(?:\|)?)+)\s*\|?\s*(.*)?") 
for test in tests: 
    a, b, c = split_re.match(test).group() 
    print a,b,c