これを行う方法は次のとおりです。
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)