2012-12-08 3 views
3

큰 텍스트 파일이있어서 특정 구/단어 뒤에있는 숫자 만 추출하고 싶습니다.텍스트 파일의 특정 단어 뒤에 번호를 추출하십시오.

Best CV Model for car: 15778 is order:2 threshold: 0 with AUC of : 0.7185 gene aau_roc: 0.466281

하나의 솔루션이 바로 뒤에 번호로 보는 것입니다 :

는 다음과 같은 형식으로이 거대한 텍스트 파일에 수십 개의 선이있다 "임계 값 :"자동차 X "를"X 순서입니다 " : X ","Y 유전자 aau_roc : X "!

결국 각 줄마다 15778, 2, 0, 0.7185, 0.466281을 갖고 싶습니다. 이미 regex와 함께 귀하의 질문에 태그를 추가 한 이후

답변

4
>>> if line.startswith('Best CV Model'): 
...  re.findall(r'\d+\.{0,1}\d*', line) 
... 
['15778', '2', '0', '0.7185', '0.466281'] 
+0

그 패턴은 내가 생각해 낸 것보다 확실히 간단하지만, 단점은 질문자가 찾고있는 라인의 구조와 일치하지 않는 라인의 숫자와 일치한다는 것입니다. – Blckknght

+0

@Blckknght 이론상 솔루션이 더 완벽한 솔루션 일 수 있습니다. 실생활에서 '더 유연한'솔루션을 사용하는 것이 현명하고 따라서 'threashold'대신 'threhsold'와 같은 철자 오류가있는 행을 구문 분석 할 수도 있습니다. 나는이 해결책을 가지고 여기에 갈 것이다. – erikbwork

2

, 난 당신이 솔루션에 이미 가까이있어 생각한다. 라인의 모든 숫자와 일치하는 정규식 패턴을 작성할 수 있습니다. 뭔가 같이 :

pattern = r"for car: (\d+) is order:(\d+) threshold: (\d+) with AUC of : ([0-9.]+) gene aau_roc: ([0-9.]+)" 

주, 나는 정확히 몇 군데에서 : 문자 주위에 몇 가지 이상한 간격을 포함하여 예제 문자열과 일치하는이를했습니다. 실제 데이터와 실제로 작동하는지 다시 확인하십시오.

내가 전체 텍스트를 통해 검색 할 수 re.finditer를 사용하는 거라고, 텍스트 파일의 검색을 수행하려면이 옵션을 사용하고 반환 할 수있는 반복 가능한 :

import re 

for model, order, threshold, auc, aau_roc in re.finditer(pattern, text): 
    do_stuff() 
+0

예, regex를 사용하고 싶습니다. re.finditer를 사용하면 다음과 같은 오류가 발생합니다! 트레이스 백 (최근 호출 마지막) : 파일 "logparser.py", 줄 10, re.finditer (패턴, 머리) 파일 "/usr/lib/python2.6/re.py"186 행, Finder in return _compile (pattern, flags) .finditer (string) TypeError : 예상 문자열 또는 버퍼 – user702846

+0

이고 내 코드는 open ("test.log") with myfile : head = list (islice (myfile, 100)) AUC = ([0-9.] +) 유전자 aau_roc : ([0-9])에 대한 차수 : (\ d +) 문항 : (\ d + .] +) " re.finditer (pattern, head) 인쇄 모델 – user702846

+0

@ user702846 아, 파일을 라인 목록으로 읽는다면 differen t 검색 코드. 나는 당신이 문자열 안에 전체 텍스트를 가지고 있다고 가정하고 있었다. 'matches = [re.search (pattern, line) for head in line]'또는 그와 비슷한 것을 시도해보십시오. – Blckknght

0
re.match('(?<=for car:)/n*',the_line); 

그냥 다른 변수를 계속 반복하면 필요에 따라 출력하고 원하는 출력에 저장하십시오.

관련 문제