ホームページ  >  記事  >  バックエンド開発  >  re.MULTILINE フラグを使用すると、re.sub が予期しない動作をするのはなぜですか?

re.MULTILINE フラグを使用すると、re.sub が予期しない動作をするのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 14:51:02372ブラウズ

Why is re.sub Behaving Unexpectedly with the re.MULTILINE Flag?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。