-1

検索するテキスト:

{ 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)
4

3 に答える 3

1
def evaluate(m):
  return re.sub(r'(\w+):(' + re.escape(value) + r'\b)', field + ":\\2", m.group(0))

output = re.sub(r'\{[^{}]*\}', evaluate, input)

このデモを参照してください。

于 2012-11-29T14:03:39.110 に答える
1

ティムの答えは本当に素晴らしいです。鉱山は2つのステップで進行します:

  • 中かっこで囲まれたすべてのコンテンツを取得する
  • それらすべてをループして、効果的な置換を続行します

これは与える:

>>> s = '{ Field1:Value Field2:Value Field1:Value } Field4:Value {Field5:Value    }'
>>> for insider in re.findall(r'{((?:\s*Field\d+:Value\s*)*)}', s):
    new = re.sub(r'\s*Field(\d+):(\w+)\s*', r' NewField\1:\2', insider)
    s = s.replace(insider, new)

>>> s
'{ NewField1:Value NewField2:Value NewField1:Value} Field4:Value { NewField5:Value}'
于 2012-11-29T14:05:08.457 に答える
1

Python は、先読みアサーションでの無限の繰り返しをサポートしています。したがって、ネストされた{/}構造 ( Python の正規表現エンジンで処理できない) がない限り、次の中括弧が右中括弧であるかどうかを簡単に確認できます。

>>> import re
>>> subject = "{Field1:Value Field2:Value} Field3:Value {Field4:Value}"
>>> re.sub(r"Field(\d+):(\w+)(?=[^{}]*\})", r"NewField\1:\2", subject)
'{NewField1:Value NewField2:Value} Field3:Value {NewField4:Value}'
于 2012-11-29T13:47:45.520 に答える