2016-04-06 34 views
0

私は次のような状況のために正規表現を書こうとしています。 私は何百もの辞書を文字列として持っています。文字列内の辞書を見つけるための正規表現

EG:

{'a':1'} 
{{'a':1, 'b':2}{'c':3}} 
{'a':4, 'b':6} 

私は、ファイルやremoved the newlinesをお読みください。今私はsplitそれらをbased on a regexしようとしています。

{'a':1'}{{'a':1, 'b':2}{'c':3}}{'a':4, 'b':6} 

re.split("({.*?})", str)。これは、第2ディクテーション全体が一致しないためには機能しません。どのようにすべての行に一致する正規表現を書くことができます辞書のリストを返します。

+0

このデータはどこから来ますか?また、 '1'の後のその一重引用符は意図的なものですか?ありがとう。 – alecxe

+2

あなたの入力データが不正です: '{{'a':1、 'b':2} {'c':3}}'は有効なPython構文ではありません。それがネストされた辞書を持つ単一の辞書であれば、それはキーとカンマがありません。そして、それを別々の2つの辞書として扱うなら、余分な中カッコがあります。 – TigerhawkT3

+0

あなたのファイルは 'json'ですか? – roippi

答えて

0

Python正規表現は、ネストされた構造体を単独で処理することはできません。別のループや再帰を行う必要があります。

ただし、上記の各行はjson応答であるとコメントしました。各行にjson.loads()を使用しないでください。

import json 

with open('path_to_file', 'r') as f: 
    data = [json.loads(line) for line in f] 

dataが現在辞書のリストになっています。あなたは、単に行うことができ

+0

辞書のいくつかが正しい構造を持たないため、json.loads()は失敗します。 json.loads()を実行する前に、文字列を辞書に分割しようとしています。 – user3786914

+0

それでは、それは_not_ jsonです。データは解析できる明確な構造を持っていますか?サンプルデータに期待される出力は? – RootTwo

0

Python

(\{[^{}]+\}) 
# look for an opening { 
# and anything that is not { or } 
# as well as an ending } 

を、これは次のようになります。

import re 
rx = r'(\{[^{}]+\})' 
string = "{'a':1'}{{'a':1, 'b':2}{'c':3}}{'a':4, 'b':6}" 
matches = re.findall(rx, string) 
print matches 
# ["{'a':1'}", "{'a':1, 'b':2}", "{'c':3}", "{'a':4, 'b':6}"] 

a demo on regex101.comを参照してください。

関連する問題