0

私はPythonと正規表現が初めてです。現在、以下のファイルの内容を読み取り、セクション内の特定のパラメーターと max_speeds を取得するプログラムを作成しようとしています。各 SECTION:# の下で、パラメーターは次の SECTION:# まですべてインデント (TAB) されます。

[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)

問題は、結果が常に間違っていることです...正規表現が常に最後のセクションの結果と一致するかのようです。

私が間違っていることと、それを行う最善の方法を教えてください。ありがとうございました!

4

3 に答える 3

3

あなたには多くの問題があります。まず、次のようなファイルの行を読み取ります。

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

行を読み取る方法では、を使用してリストを作成し、を使用readlinesして文字列を作成します。strこれにより、のようなデータが得られます"['line1\n', 'line2\n']"。次に、その文字列を繰り返すと、各文字が順番に表示されます。

ただし、ファイルを自分で読み取る必要はおそらくありません。組み込みモジュールConfigParserは、これらのファイルを直接解析し、外観を提供します。

于 2012-07-02T02:04:20.183 に答える
0

ConfigParser モジュールの使用中にセクションの下のインデントを処理するには、次のコードを使用するだけです。

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')
于 2012-07-02T05:04:44.307 に答える
0

次のようなものを試してみてください:(私は実行してコードをテストしていません。自分で実行してください)

import re    
pattern = '(?<=SECTION:13).+(max_speed\s\=\s\w+)'
mattches = re.findall(pattern, '\n'.join(open('file.txt').readlines()))
print mattches
于 2012-07-02T02:55:52.527 に答える