2010-06-02 5 views
0

구문 분석하려는 데이터 행이 있습니다. 데이터는 다음과 같습니다파이썬에서 구분 기호로 라인 구문 분석

a score=216 expect=1.05e-06 
a score=180 expect=0.0394 

는 내가 뭘 원하는 각 라인을 구문 분석하고 반환이 개 값 (점수 및 예상) 서브 루틴 하는 것입니다.

그러나 나의이 기능은 작동하지 않습니다

def scoreEvalFromMaf(mafLines): 
    for word in mafLines[0]: 
     if word.startswith("score="): 
      theScore = word.split('=')[1] 
      theEval = word.split('=')[2] 
      return [theScore, theEval] 
    raise Exception("encountered an alignment without a score") 

을 할 수있는 올바른 방법은 무엇 조언을 주시기 바랍니다?

+0

는 ValueError' 또는 뭔가 '처럼 만들고 그,'Exception'를 제기하지 . –

답변

2

각 줄을 공백으로 나눠서 각 조각을 개별적으로 파싱하려는 것 같습니다. ..

def scoreEvalFromMafLine(mafLine): 
    theScore, theEval = None, None 
    for word in mafLine.split(): 
     if word.startswith("score="): 
      theScore = word.split('=')[1] 
     if word.startswith("expect="): 
      theEval = word.split('=')[1] 

    if theScore is None or theEval is None: 
     raise Exception("Invalid line: '%s'" % line) 

    return (theScore, theEval) 

당신이 문자열 목록은 이후 오히려 각 공간보다) (첫 번째 줄의 각 문자를 반복 것하던 방법

: mafLines 문자열은 .readlines()에서 (즉, 한 줄 경우 .
+0

@AB : 안녕 토니, 고마워. 그러나 나는 또한 같은 메시지를 받는다. "오류 : 'list'객체는 스 니펫을 사용하여 'split'"'속성이 없습니다. – neversaint

+0

그러면'mafLines'는리스트의리스트이지 문자열의리스트는 아닙니다. 나는'mafLines'가'.readlines() '또는 유사한 것으로부터 출력되었다고 가정하고 있었지만, 그렇지 않다면 정확히 무엇인지, 또는 어떻게 만드는지 분명히해야 할 것입니다. –

+0

mafLine [0]의 단어에 대해''를 사용하여 그것을 고쳤습니다 : "' – neversaint

2

mafLines 줄 목록이있는 경우 첫 번째 줄만보기를 원하면 .split 그 줄을 얻으십시오. 예를 들면 :

이 두 문자열 항목 튜플을 반환 할 것을
def scoreEvalFromMaf(mafLines): 
    theScore = None 
    theEval = None 
    for word in mafLines[0].split: 
     if word.startswith('score='): 
      _, theScore = word.partition('=') 
     elif word.startswith('expect='): 
      _, theEval = word.partition('=') 
    if theScore is None: 
     raise Exception("encountered an alignment without a score") 
    if theEVal is None: 
     raise Exception("encountered an alignment without an eval") 
    return theScore, theEval 

참고; 당신의 int와 float를 원하는 경우, 예를 들어, 당신은

return int(theScore), float(theEval) 

에 마지막 줄을 변경해야하고 두 문자열이 나타내는 해야하는 유형에 유효하지 않은 경우 다음 당신은 ValueError를 예외를 얻을 것이고, 두 문자열이 모두 유효한 경우 두 개의 숫자가있는 반환 된 튜플.

+0

@AM : 알렉스, 고마워. essage' "오류 : 'list'객체에는 'split'"속성이 없습니다. BTW는 함수 출력을 저장하는 올바른 방법입니다 :'[score, exp] = scoreEvalFromMaf (maf)' – neversaint

+1

mafLines와 같은 소리는 문자열 목록이 아닌 목록의 목록입니다. 어떻게 그걸 만들었 니? 그 코드에는'.split()'(즉, 함수 호출)을 사용해야하고'word 대신'word.split ('=')'를 사용해야합니다. 파티션 ('=') ' –

+1

@neversaint, 안토니가 말했듯이, 신비한'mafLines' ** **가 무엇인지 명확히 밝혀야한다. 당신이 그것을 어떻게 구축했는지는 "마음을 읽고"그 조각들이 무엇인지를 신의 공기로부터 거의 신성하게하는 것이 본질적으로 불가능합니다. 예, 일단이 점을 명확히하면, 쓸모없는 대괄호를 과제의 오른쪽에있는 '점수, 특급'주위에 둘 수 있습니다. –

1

필수 가능성이 부적절 정규 표현식 솔루션 :이 항상 제기 올바로 수행 더 좁은 무언가를 잡으려고 불가능으로 여담으로

import re 
def scoreEvalFromMaf(mafLines): 
    return [re.search(r'score=(.+) expect=(.+)', line).groups() 
      for line in mafLines] 
+1

유효하지 않은 입력에 대해 폭발적으로 폭발합니다 (해당 동작은 원하는 것일 수도 있음). '(. +)'를'(. *) '로 바꾸면 공백 값을 잡는데 도움이되지만 여전히 사기스러운 입력으로는 죽을 것입니다. –

+0

True이면 충분합니다. 그것은 대체 전략에 대한 빠르고 단순한 데모입니다. – harto

관련 문제