検索するテキスト:
{ Field1:Value Field2:Value Field1:Value }
次に、フィールドが特定の値に等しい場合に、フィールドが{&}境界内にある場合にのみ、フィールドの各インスタンスを見つけて置き換えたいと思います。
注: {の後、最初のフィールドの前に可変空白が存在する可能性があります。そして、さまざまな数のフィールド。
正規表現:
({\s*)(?:Field1)(:(?:.*?)})
テキストをグループに分割して、別のフィールド名で新しいテキストを再作成できるようにします。
例えば:
\1Field3\2
ただし、これはField1の最初のインスタンスにのみ一致し、2番目のインスタンスを無視します。これは、正規表現エンジンが終了から継続するためです}
その後、LookbehindとLookaheadを使用することを考えましたが、Pythonを購入すると、これらのメソッドの変数の繰り返しがサポートされないため、それはできませんでした。
「re.sub」メソッドは、正規表現が見つかった/置き換えられた場合に変更されたテキストを返しますが、実際には置換が行われたかどうかを示していないため、一致するものが見つからなくなるまでループすることはできません。どちらが正しくないと感じているかを確認するための2番目の正規表現。
単一の正規表現でこれを行う方法はありますか?
- - - 編集 - - -
エマニュエルとΩメガの両方のソリューションを、まだ複数の段階にありますが、探していたものに抽出することができましたが、この場合、複数のステップが唯一のソリューションだと思います。
エマニュエルのコード(私の解決策のために働いています)
s = '{ Field1:Value Field2:Value Field1:Value } Field1:Value {Field1:Value}'
for insider in re.findall(r'{\s*Field1:.*?}', s):
new = re.sub(r'Field1:', r'NewField:', insider)
s = s.replace(insider, new)
Ωmegaのコード(私のソリューションで機能します)
def evaluate(m):
return re.sub('Field1:', 'NewField:', m.group(0))
input = '{ Field1:Value Field2:Value Field1:Value } Field1:Value {Field1:Value}'
output = re.sub('{[^{}]*?}', evaluate, input)