2

一重引用符で囲まれていない場合、文字列を置き換える正規表現を作成しようとしています。たとえば、次の文字列で FOO を XXX に置き換えたいとします。

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"

目的の出力は次のとおりです。

output = "' FOO ' abc 123 ' def FOO ghi 345 ' XXX '' XXX ' lmno 678 FOO '"

私の現在の正規表現は次のとおりです。

myregex = re.compile("(?<!')+( FOO )(?!')+", re.IGNORECASE)

ルックアラウンド演算子を使用する必要があると思いますが、方法がわかりません...正規表現は私には複雑すぎます:D

手伝って頂けますか?

4

2 に答える 2

3

これを行う方法は次のとおりです。

import re

def replace_FOO(m):
    if m.group(1) is None:
        return m.group()

    return m.group().replace("FOO", "XXX")

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"

output = re.sub(r"'[^']*'|([^']*)", replace_FOO, string)

print(string)
print(output)

[編集]

re.sub関数は、文字列テンプレートまたは関数のいずれかを置換として受け入れます。置換が関数の場合、一致が見つかるたびに関数が呼び出され、一致オブジェクトが渡され、返された値 (文字列である必要があります) が置換文字列として使用されます。

パターン自体については、検索'時に、現在の位置に がある場合は next を含めて一致し、そうでない場合は、次または文字列の末尾'を除外して一致します。'

置換関数は各一致で呼び出され、適切な結果を返します。

実は、今考えてみると、グループを使う必要はまったくありません。代わりにこれを行うことができます:

def replace_FOO(m):
    if m.group().startswith("'"):
        return m.group().replace("FOO", "XXX")

    return m.group()

string = "' FOO ' abc 123 ' def FOO ghi 345 ' FOO '' FOO ' lmno 678 FOO '"

output = re.sub(r"'[^']*'|[^']+", replace_FOO, string)
于 2012-08-03T18:16:19.027 に答える
2

これは、可変長の後読みなしで行うのは困難です。Python 正規表現がサポートしているかどうかはわかりません。とにかく、簡単な解決策は次のとおりです。

次の正規表現を使用します。 (?:[^'\s]\s*)(FOO)(?:\s*[^'\s])

最初のキャプチャ グループは正しい結果を返す必要があります。

例のように、これが常に単一のスペースを含む引用符である場合、固定長の後読みを使用できます。(?<=[^'\s]\ )FOO(?=\s*[^'\s])これは、必要なものと正確に一致します。

于 2012-08-03T08:58:40.567 に答える