2012-07-02 5 views
0

저는 파이썬과 정규식에 익숙하지 않습니다. 나는 현재 아래 파일의 내용을 읽고 섹션 내에서 특정 매개 변수와 max_speed를 얻는 프로그램을 만들고자 노력 중이다. 각 섹션에서 : #파이썬 정규 표현식, 잘못된 결과

[SECTION:3] 
     paramter = 3 
     state = AZ 
     car = toyota 
     max_speed = 90.000 
     any_pets = yes 
[SECTION:13] 
     paramter = 10 
     state = NY 
     car = honda 
     max_speed = 120.000 
     any_pets = yes 
[SECTION:85] 
     paramter = 31 
     state = TX 
     car = kia 
     max_speed = 30.000 
     any_pets = no 

이 내 코드입니다 : #, 매개 변수는 다음 절까지 모두 들여 쓰기 (TAB)이다

import re 
file = open('file.txt').readlines() 
file_str = str(file) 

for lines in file_str: 
    myreg = re.compile(r'(?<=SECTION:13).+(max_speed\s\=\s\w+)') 
    myreg1 = myreg.search(lines) 
    print myreg1.group(1) 

문제는 결과가 항상 잘못이다 .. .it 정규식이 항상 마지막 섹션의 결과와 일치하는 것처럼.

내가 뭘 잘못하고 무엇을하는 최선의 방법이 될지 알려 주시기 바랍니다. 고맙습니다!

+3

당신은 파이썬 [ConfigParser] (http://docs.python.org/library/configparser.html#examples) – Levon

답변

3

많은 문제가 있습니다.

with open('file.txt') as f: 
    for line in f: 
     # process each line. 

당신이 라인을 읽는 방법, 당신은 다음, readlines으로 목록을 만들 그것을 "['line1\n', 'line2\n']"처럼 당신에게 데이터를 제공합니다 str와 문자열합니다 첫째,이 같은 파일의 행을 읽습니다. 그 문자열을 반복하면 차례대로 각 문자를 줄 것입니다.

하지만 파일을 직접 읽을 필요는 없습니다. 내장 된 모듈 ConfigParser은이 파일들을 직접 파싱하여 보여줍니다.

+0

안녕 네드 관심이 답변 주셔서 대단히 감사합니다 수 있습니다. 나는'ConfigParser'의 몇 가지 예를 살펴 봤고 나는 그것을 내 솔루션에 사용할 것이라고 생각한다. 그러나 나는 다음 당신과 함께 공유하고 싶었 : 'F 오픈 ('file.txt를')와' \t'F의 라인 : ' \t \t'myreg = re.compile (R'(< = 제 :. 13) + (max_speed \ S \ = \ S \ + w) ')' \t \t'myreg1 = myreg.search (선)' \t \t'인쇄 myreg1.group (1)' 왜 myreg1 'SECTION : 13'에서'max_speed'와 일치하지 않습니까? 어떤 아이디어? – Squid

+0

이 답변을 원하면 큰 체크 표시로 선택하십시오. –

+0

오징어 : 줄을 하나씩 찾고 있으므로'[SECTION : 13]'과'max_speed = ..'와는 다른 줄에 있기 때문에 일치하는 것을 기대할 수 없습니다. 두 문자열 모두에 단일 문자열을 사용할 수 없습니다. –

0

이 같은 몇 가지를 시도해야합니다 : 바로 다음 사용하여 ConfigParser 모듈을 사용하는 동안 섹션에서 들여 쓰기를 처리하기 위해

import re  
pattern = '(?<=SECTION:13).+(max_speed\s\=\s\w+)' 
mattches = re.findall(pattern, '\n'.join(open('file.txt').readlines())) 
print mattches 
+1

항상 ConfigParser를 사용하는 것이 더 좋습니다! – pinkdawn

+0

' '\ n'. 조인 (열기 (..). readlines())'? 시도해 보셨습니까 :'open (..). read()'? –

+0

: P 코드를 복사하고 '\ n '.join()을 지연 추가하십시오. – pinkdawn

0

를 (그것이 자신을 실행할 수 있도록, 내가 운영하지 않는 및 코드를 테스트) 코드 :

from ConfigParser import ConfigParser 

class fp(): 
    def __init__(self, filename): 
     self.fileobj = open(filename) 

    def readline(self): 
     return self.fileobj.readline().lstrip() 

f = fp('e:/file.txt') 
config = ConfigParser() 
config.readfp(f) 
print config.get('SECTION:3', 'state')