1

したがって、これは python の正規表現では機能しません。

>>> re.sub('oof', 'bar\\', 'foooof')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
  File "C:\Python27\lib\re.py", line 270, in _subx
    template = _compile_repl(template, pattern)
  File "C:\Python27\lib\re.py", line 257, in _compile_repl
    raise error, v # invalid expression
error: bogus escape (end of line)

私は自分の目が私をだましていると思ったので、これをしました:

>>> re.sub('oof', "bar\x5c", 'foooof')

同じものを手に入れました。私は検索し、人々がこの問題を抱えていることを確認しました. では、repl をただの文字列として扱うことの問題点は何でしょうか? repl に配置できる追加の書式設定オプションはありますか?

4

4 に答える 4

3

文字列エスケープを処理したくない場合は、ラムダを使用でき、文字列は処理されません。

>>> re.sub('oof', lambda x: 'bar\\', 'foooof')
'foobar\\'
>>> s=re.sub('oof', lambda x: 'bar\\', 'foooof')
>>> print s
foobar\

ただし、印刷すると解釈されます。

>>> re.sub('oof', lambda x: 'bar\r\\', 'foooof')
'foobar\r\\'
>>> print re.sub('oof', lambda x: 'bar\r\\', 'foooof')
\oobar

または、生の文字列を使用します。

>>> re.sub('oof', r'bar\\', 'foooof')
'foobar\\'
于 2013-04-30T03:37:51.487 に答える
3

はい、置換文字列はエスケープ文字として処理されます。ドキュメントから:

repl は文字列または関数です。文字列の場合、その中のバックスラッシュ エスケープが処理されます。つまり、\n は単一の改行文字に変換され、\r はキャリッジ リターンに変換されます。\j などの不明なエスケープはそのままにします。\6 などの後方参照は、パターン内のグループ 6 に一致する部分文字列に置き換えられます。

于 2013-04-30T02:58:33.920 に答える
2

生の文字列を使用する:

re.sub('oof', r'bar\\', 'foooof')

プレフィックスがないr場合は、バックスラッシュを二重にエスケープする必要があります。

re.sub('oof', 'bar\\\\', 'foooof')
于 2013-04-30T02:47:18.053 に答える
-1

あなたfoobar\は出力として期待しましたか?もしそうなら、re.sub('oof', r'bar\\', 'foooof')あなたが必要とするものです。これrは、Python に後続の文字列を生の文字列として扱うように指示するため、バックスラッシュは、後続の文字を特別に扱う必要があるという記号として機能するのではなく、バックスラッシュとして扱われます。これについて詳しく説明しているドキュメントのセクションを次に示します

于 2013-04-30T02:52:07.140 に答える