2014-11-14 57 views
0

Так что у меня куча линий (производств), как одно из следующих действий:Как разбить некоторые части линии?

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

Существует всегда одна часть на LHS, а затем стрелка затем одну или две части на ОРЗ. Как я могу их хранить или называть? (Например, итерация по всем линиям (производством) и проверка, является ли LHS VBD или RHS RATTLED (для первого рисунка), или RHS0 является CC, а RHS1 - PP-PP | (для второго шаблона)) ?

Опять же, шаблон в постановках всегда следует одно из следующих действий:

A -> 'B' 

или

C -> D E 

А, В, С, D и Е могут быть любыми (цифры, буквы, знаки и т. д.)

ответ

2

Если вы хотите разбить каждую строку на голову (например, VBD) и хвост (например, 'RATTLED'), одним из простых способов сделать это будет использование е 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

Это не поймать две части РИТ, во втором образце! – sabzdarsabz

+0

@sabzdarsabz Хорошо, я думаю, может быть, LHS и RHS вы имеете в виду «левую сторону» и «правую сторону»? Это немного сбивает меня с толку, и я не уверен, что люди получат это немедленно, особенно учитывая, как текст, который вы просматриваете, довольно плотный и запутанный. – furkle

+1

@sabzdarsabz Я предполагаю, что вы подразумеваете под «двумя частями» означает две части, разделенные трубой? Если это так, я обновил это, чтобы он работал. – furkle

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 
Смежные вопросы