re.sub と Flag による予期しない置換
Python のドキュメントには、re.MULTILINE フラグによりキャレット文字 (^) を使用できると記載されています。各行の先頭で一致します。ただし、このフラグを re.sub で使用すると、予期しない動作が発生する可能性があります。
次の例を考えてみましょう:
<code class="python">import re s = """// The quick brown fox. // Jumped over the lazy dog.""" result = re.sub('^//', '', s, re.MULTILINE) print(result)</code>
期待される結果は、「//」で始まるすべての行が次のようになります。空の文字列に置き換えられ、
The quick brown fox. Jumped over the lazy dog.
のみが残ります。ただし、実際の結果は次のようになります。
The quick brown fox. // Jumped over the lazy dog.
問題の理由
この問題は、 re.sub 関数が置換の最大数を表す 4 番目の引数を受け入れるために発生します。この例では、re.MULTILINE がフラグとしてではなく誤ってカウントとして使用されました。
解決策
この動作を修正するには、名前付き引数を使用してflag:
<code class="python">result = re.sub('^//', '', s, flags=re.MULTILINE)</code>
または、re.sub:
<code class="python">regex = re.compile('^//', re.MULTILINE) result = re.sub(regex, '', s)</code>
re.MULTILINE フラグを正しく指定することで、正規表現を目的のフラグでコンパイルしてから使用できます。文字列内の位置に関係なく、パターン ^// がすべて置換されることを保証できます。
以上がre.MULTILINE フラグを使用すると、re.sub が予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。