0

正規表現を使用して、python 式の変数を文字列形式で検索して置き換えています。「var」を別の関数または変数名の一部に置き換えたくありません。(expr および expr.replace("var" など) で if 'var' を使用するソリューションを禁止しました)。

したがって、次の正規表現を使用して、前の文字 (許可されている) と次の文字 (許可されている) を確認します。

pattern = re.compile(r'(^var)(?=\+|\-|\*|\/| |$)|(?<=\+|\=|\[|\-|\*|\/|,| |\()var(?=\+|\-|\*|\/|$| |,|\))')

ô_O、複雑に見えますが、「var」を「###」に置き換えた次のテストで機能します

expr     = ' var + variable + avar + var[x] + fun(var,variable) + fun2(variable, var, var1) + fun3(variable,var)+ var  -var/var+var*var*(var)'
expected = ' ### + variable + avar + var[x] + fun(###,variable) + fun2(variable, ###, var1) + fun3(variable,###)+ ###  -###/###+###*###*(###)'

私は正規表現を使用します:

  • 「var」が式に含まれているかどうかを確認する
  • 式の「var」を置き換える
  • 置換後に「var」が式に含まれていないかどうかを確認します。
if pattern.search(expr):
  new_expr = re.sub(pattern, '###', expr)  
  assert not pattern.search(new_expr), 'Replace failed'

私はコードを頻繁に使用していますが、よりシンプルで高速なものが存在するかどうか疑問に思っていますか?

4

1 に答える 1

1

さて、あなたが必要とするパターンは次r'\bvar\b'のとおりです: は、\b「変数」のようなものを置き換えずに、置き換えたい完全な「文字列」を定義できる「境界線」です。

ただし、「予想される」文字列をテストすると、間違いがあることがわかりました。

expected = ' ### + variable + avar + var[x] ' # <- this last 'var' should be ###

ともかく。解決:

>>> import re
>>> re.sub(r'\bvar\b', '###', expr)
' ### + variable + avar + ###[x] + fun(###,variable) + fun2(variable, ###, var1) + fun3(variable,###)+ ###  -###/###+###*###*(###)'
于 2013-10-21T13:27:45.233 に答える