Как искать предложение по ключевым словам до конца строки в python - PullRequest
0 голосов
/ 21 сентября 2018

Я поражен небольшой логической частью

мой код здесь

def find_between( string, first, last ):
    list1 = []
    try:
        start = string.index( first ) + len( first )
        end = string.index( last, start )
        list1.append(string[start:end])
        print(list1)
    except ValueError:
        return ""

with open("sample.txt")as f:
    data = f.read()
    print(data)

    find_between( data, "*CHI:  " , "%mor:  " )

мой sample.txt содержит:

*CHI:   I saw a giraffe and a elephant .
%mor:   pro:sub|I v|see&PAST det:art|a n|giraffe coord|and det:art|a
    n|elephant .
%gra:   1|2|SUBJ 2|0|ROOT 3|4|DET 4|2|OBJ 5|4|CONJ 6|7|DET 7|5|COORD 8|2|PUNCT
*CHI:   <that> [/] (.) that (i)s it . [+ bch]
%mor:   pro:dem|that cop|be&3S pro:per|it .
%gra:   1|2|SUBJ 2|0|ROOT 3|2|PRED 4|2|PUNCT
*CHI:   I saw an elephant go swimming .
%mor:   pro:sub|I v|see&PAST det:art|a n|elephant v|go part|swim-PRESP .
%gra:   1|2|SUBJ 2|0|ROOT 3|4|DET 4|5|SUBJ 5|2|COMP 6|5|OBJ 7|2|PUNCT
*CHI:   <I saw eleph> [//] I saw the <g> [/] giraffe and the elephant <s>
    [//] drop ball in the pool .
%mor:   pro:sub|I v|see&PAST det:art|the n|giraffe coord|and det:art|the
    n|elephant n|drop n|ball prep|in det:art|the n|pool .
%gra:   1|2|SUBJ 2|0|ROOT 3|4|DET 4|2|OBJ 5|4|CONJ 6|9|DET 7|9|MOD 8|9|MOD
    9|5|COORD 10|9|NJCT 11|12|DET 12|10|POBJ 13|2|PUNCT
*CHI:   I saw giraffe swimming in the pool to get that ball .
%mor:   pro:sub|I v|see&PAST n|giraffe part|swim-PRESP prep|in det:art|the
    n|pool inf|to v|get pro:dem|that n|ball .

Я должен вернуть всепредложение, которое находится между "* CHI:" и "% mor:", мой код приносит только первую строку, которая

I saw a giraffe and a elephant

, помогите мне, итерируя до конца строки, и я должен быть в состоянии напечататьвсе эти предложения между "* CHI:" и "% mor:"

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Пытался сделать это без регулярных выражений, хотя я все еще не уверен, разрешено ли печатать %gra между ними.

def find_between( string, first, last ):
    flag = True
    try:
        buffer = ""
        op_string = ""
        for line in string:
            if first in line:
                buffer += line
                flag = True

            elif last in line:
                op_string += buffer 
                buffer = "" # flush buffer
                flag = False

            elif flag is True:
                buffer += line

        print(op_string)

    except ValueError:
        return ""

with open("sample.txt")as f:
    data = f.readlines()
    #print(data)

    find_between( data, "*CHI:  " , "%mor:  " )
0 голосов
/ 21 сентября 2018

Итак, я использовал регулярное выражение и простую строку вместо файла, но это тот же принцип.Проверьте рабочий код:

import re

s = """
    *CHI:   I saw a giraffe and a elephant .
    %mor:   pro:sub|I v|see&PAST det:art|a n|giraffe coord|and det:art|a 
        n|elephant .
    %gra:   1|2|SUBJ 2|0|ROOT 3|4|DET 4|2|OBJ 5|4|CONJ 6|7|DET 7|5|COORD 8|2|PUNCT
    *CHI:   <that> [/] (.) that (i)s it . [+ bch]
    %mor:   pro:dem|that cop|be&3S pro:per|it .
    %gra:   1|2|SUBJ 2|0|ROOT 3|2|PRED 4|2|PUNCT
    *CHI:   I saw an elephant go swimming .
    %mor:   pro:sub|I v|see&PAST det:art|a n|elephant v|go part|swim-PRESP .
    %gra:   1|2|SUBJ 2|0|ROOT 3|4|DET 4|5|SUBJ 5|2|COMP 6|5|OBJ 7|2|PUNCT
    *CHI:   <I saw eleph> [//] I saw the <g> [/] giraffe and the elephant <s>
        [//] drop ball in the pool .
    %mor:   pro:sub|I v|see&PAST det:art|the n|giraffe coord|and det:art|the
        n|elephant n|drop n|ball prep|in det:art|the n|pool .
    %gra:   1|2|SUBJ 2|0|ROOT 3|4|DET 4|2|OBJ 5|4|CONJ 6|9|DET 7|9|MOD 8|9|MOD
        9|5|COORD 10|9|NJCT 11|12|DET 12|10|POBJ 13|2|PUNCT
    *CHI:   I saw giraffe swimming in the pool to get that ball .
    %mor:   pro:sub|I v|see&PAST n|giraffe part|swim-PRESP prep|in det:art|the
        n|pool inf|to v|get pro:dem|that n|ball .
    """

result = re.findall('(?<=CHI:)(.*?)(?=%mor)', s, flags=re.S)
print(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...