2012-07-02 89 views
0

我是python和正則表達式的新手。我目前正在嘗試製作一個程序,該程序讀取下面的文件的內容,並獲取部分內的特定參數和max_speeds。在每個SECTION:#,參數都縮進(TAB),直到下一節:#python正則表達式,錯誤結果

[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 

這是我的代碼:

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) 

的問題是,結果總是錯的..就好像正則表達式總是與最後一節的結果相匹配。

請讓我知道我在做什麼錯,什麼是最好的做法。謝謝!

+3

你可能有興趣在Python [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,然後使其與str一個字符串,它會給你喜歡"['line1\n', 'line2\n']"數據。然後迭代該字符串將依次給你每個字符。

但是你可能根本不需要自己讀取文件。內置模塊ConfigParser將直接爲您解析這些文件,請給它看看。

+0

嗨斯內德,非常感謝你的回答。我已經看了幾個'ConfigParser'的例子,我有一種感覺,我會用這個來解決我的問題。不過,我想與大家分享如下: '開放的( 'file.txt的')爲f:' \t'在F線:' \t \t'MYREG = re.compile(R'(< = SECTION: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'.join(open(..)。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')