たぶんこれが役立ちます:
value = "addr = &myvariable;"
findVar = "myvariable"
m = re.findall("[&]{0};".format(findVar), value)
print m
# prints: ['&myvariable;']
[] 内にアンパサンドを入れてエスケープしたことに注意してください。2 つのバックスラッシュでエスケープすることもできます。
m = re.findall("\\&{0};".format(findVar), value)
編集:
コメントでの議論に基づく re.sub バージョンは次のとおりです。
value = "addr = &myvariable;\naddr = &myvariable;\nfuncCall( &myvariable )"
oldVarName = "myvariable"
newVarName = "mynewvariable"
m = re.sub("(\\&){0}(;?)".format(oldVarName), r"\1"+newVarName+r"\2", value)
print m
# this will print:
# addr = &mynewvariable;
# addr = &mynewvariable;
# funcCall( &mynewvariable )
このパターンは、次と同じ結果になります。
value.replace("&"+oldVarName,"&"+newVarName)
最初のアンパサンドと最後のセミコロンを一致させるために括弧を使用しています。次に、\1 と \2 を使用して、これらの一致を置換文字列内に戻します。この結果は、value.replace("&"+oldVarName, "&"+newVarName) を使用した場合と同様になることに注意してください。
編集:
これはおそらく必要なものに近いです。
アンパサンドで始まるすべてのインスタンスを置き換え、AND には古い変数名全体が含まれ、[A-Za-z0-9_] 内にあるその後の文字は含まれません。
value = "addr = &myvariable;\naddr = &myvariable;\nfuncCall( &myvariable )\nfuncCall2( &myvariable, &myvariablelongername )"
oldVarName = "myvariable"
newVarName = "mynewvariable"
m = re.sub("(\\&){0}(?![A-Za-z0-9_])".format(oldVarName), r"\1"+newVarName, value)
print m
# prints:
# addr = &mynewvariable;
# addr = &mynewvariable;
# funcCall( &mynewvariable )
# funcCall2( &mynewvariable, &myvariablelongername )
(その最後の部分は、C の変数名で、開始する必要がある最初の文字 [A-Za-z_] の後の任意の有効な文字です。これは、「nhahtdh」による回答にも記載されています)
nhahtdh が例として提供したものを使用すると、これは最後の例の短いバージョンになります。
re.sub("(\\&){0}(?!\b)".format(oldVarName), r"\1"+newVarName, value)
この回答を書いたときは初めてで、この回答のコメントで自分で混同したので、これを情報として追加します。r"\1" のような文字列の前のrは、文字列を raw に変換しますストリング。
r '\ が保持される (リテラル化された) 生の文字列: 正規表現と Windows パスに便利!' ソース: http://rgruet.free.fr/PQR26/PQR2.6.html#Strings