次のように、特定の値を含むすべてのセクション名を一致させる方法はありますか。
section aaa:
some values
value 5
section bbb:
more values
value 6
section ccc:
some values
value 5
section ddd:
more values
value 6
例えば:
section (.*?):.*?value 6 (DOTALL|MULTILINE)
の代わりにaaa
,に一致します。ccc
bbb
ddd
と一致させる方法はありbbb
ますddd
か?
ありがとう
更新: 値の行にコロンが含まれていない、またはスペースで始まっていないという前提に基づいた (機能する) ソリューションがあります。ただしvalue 6
、値にコロンが含まれている場合やインデントされていない場合でも、一致してそれに先行する最も近いセクションを取得する方法はありますか?
nhahtdh の回答: 正規表現で逆方向に検索しません。後読みがあります (この場合、可変幅の後読みが必要になります) が、非常に非効率的であり、Python の既定の re モジュールはどの形式の後読みもサポートしていません。
私の結論:これは、上記の仮定を使用して純粋な正規表現を使用するか、(私の好み) drawk によって提案された正規表現と python を組み合わせたアプローチを使用することで実行できます (これにはいくつかの仮定があります。つまり、そのセクションには が含まれている必要がありますvalue
) 。
更新2:これが私が最終的に得たものです。上記の制限なしで動作するようです。値に で始まる行を含めることはできないという前提がありますsection .*:
。セクションを次のセクションまで一致させますが、((?=...)
構文を使用して)それを含めません\Z
。また、文字列の終わりである最後のセクションと一致させるために。
for m in re.finditer(r'^section (.*?):(.*?)(?=(^section .*:)|\Z)', str1, re.MULTILINE | re.DOTALL):
section = m.group(1)
values = m.group(2)
if "value 6" in values:
print section