始める前に、これを行う正規表現よりも優れた方法があることを知っています(トークナイザーなど)。それは問題の内容ではありません。私はすでに正規表現を使用して立ち往生しており、アドバイスが必要な1つの特別な場合を除いて、必要に応じてすでに機能しています。
JavaScriptのようなコードをスキャンしてnew
、すべてのオブジェクト宣言の前にキーワードを挿入する必要があります。このキーワードを必要とするすべてのオブジェクトの名前はすでに知っていますが、開始する前にコードにそのキーワードが含まれることはないことを知っています(したがって、繰り返されるnew
単語を処理したり、何かがオブジェクトであるかどうかを推測したりする必要はありませんたとえば、一般的な行は次のようになります。
foo = Bar()
私がすでに知っているところでは、それBar
は「クラス」であり、オブジェクト宣言には「new」が必要です。次の正規表現でうまくいきます。
for classname in allowed_classes:
line = re.sub(r'^([^\'"]*(?:([\'"])[^\'"]*\2)*[^\'"]*)\b(%s\s*\()' % classname, r'\1new \3', line)
それは魅力のように機能しclassname
、文字列の中にあるときは触れないようにします(正規表現の最初の部分は、事前に偶数の引用符があることを確認するように指示しています-ネストされた状態で壊れてしまうという点で少しナイーブです引用符ですが、その場合を処理する必要はありません)。問題は、クラス名も$
それらに含まれる可能性があることです。$Bar
したがって、 allowed_classesに存在する場合は、次の行も許可されます。
foo = $Bar()
上記の正規表現は、ドル記号のために無視されます。エスケープすることでうまくいくと思いましたが、このロジック$Bar
は、クラスの1つであっても、上記の行には影響しないようです。
for classname in allowed_classes:
line = re.sub(r'^([^\'"]*(?:([\'"])[^\'"]*\2)*[^\'"]*)\b(%s\s*\()' % re.escape(classname), r'\1new \3', line)
手で逃げてみまし\
たが、効果もありません。$
誰かがへの変換が機能しない理由\$
とそれを修正できるものを説明できますか?
ありがとう