私は単に次のようなことをする単純な「パーサー」を持っています:
[x.split('=') for x in mystring.split(',')]
ただし、mystringは次のようなものにすることができます
'foo=bar,breakfast=spam,eggs'
明らかに、
素朴なスプリッターはそれをしません。これについては、 Python 2.6 標準ライブラリに限定されているため、
たとえばpyparsingは使用できません。
期待される出力は
[('foo', 'bar'), ('breakfast', 'spam,eggs')]
私は正規表現でこれをやろうとしていますが、次の問題に直面しています:
私の最初の試み
r'([a-z_]+)=(.+),?'
は私に与えました
[('foo', 'bar,breakfast=spam,eggs')]
明らかに、
貪欲.+
でなくても問題は解決しません。
だから、
どういうわけか最後のコンマ (または$
) を必須にする必要があると思います。
それだけでは実際には機能しません。それと
同様
r'([a-z_]+)=(.+?)(?:,|$)'
に、コンマを含む値のコンマの後ろのものは省略されます。[('foo', 'bar'), ('breakfast', 'spam')]
何らかの後読み (?) 操作を使用する必要があると思います。
質問
1.どちらを使用しますか? または
2.それ/これを行うにはどうすればよいですか?
編集:
以下のdaramarakの回答に基づいて、私はabarnertが後で少し冗長な形式で提案
した
のとほとんど同じことをすることになりました。
vals = [x.rsplit(',', 1) for x in (data.split('='))]
ret = list()
while vals:
value = vals.pop()[0]
key = vals[-1].pop()
ret.append((key, value))
if len(vals[-1]) == 0:
break
編集2:
私の好奇心を満たすために、これは実際に純粋な正規表現で可能ですか? つまりre.findall()
、2タプルのリストを返すでしょうか?