0

ファイルには以下のような行がたくさんあります。

{"first_name":"John","last_name":"Smith","age":30}
{"first_name":"Tim","last_name":"Johnson","age":34}

最初に、これを json モジュールを使用して辞書としてインポートしようとしたので、キーの値を出力することができました。問題は、一部の行に右中括弧がないか、他の問題があり、フィールドが行ごとに同じ順序になっていないことです。それはインポートを妨げています。

だから今、私はこれを正規表現でやろうとしています。私はこれを持っています:

fo = open("c:\\newgoodtestsample.txt", "r")
x = fo.read()
match1 = re.search('first_name"(.*?)"(.*?)"', x) 
if match1:
    print match1.group(2)

これは、名前だけの値を返します。他のフィールドも返せるようにしたいです。これは正規表現テスターで機能しましたが、コードで機能させることができません:

(first_name|last_name|age)"(.*?)"(.*?)"

最後に、それが判明したら、ファイルの各行 (最初の行だけでなく) を読み取り、要求された正規表現データを各行からファイルに出力する必要があります。for ループを挿入しようとしましたが、最初の行が何度も繰り返されるため、挿入が間違っているに違いありません。任意の支援をいただければ幸いです。

4

1 に答える 1

1

以下はあなたが望むことをしているようです。正規表現は、JSON からのすべての値フィールドを一致するグループとして返​​す必要があります (ただし、それらの値が格納されているキーワードではありません)。

withまた、すべての行が読み取られた後にファイル ハンドルを自動的に閉じるため、コンテキスト マネージャーを使用することをお勧めします。これは、for ループだけで簡単に実行できます。

with open("c:\\newgoodtestsample.txt", "r") as fo:
    for line in fo:
        result = re.findallr'"(\w*?)":"?(\w*)"?', line) 
        d = {k:v for k,v in re.findall(r'"(\w*?)":"?(\w*)"?', line)}
        if 'first_name' in d:
            # print first_name into file
        else:
            # print empty first_name field
于 2013-08-25T19:30:15.747 に答える