ホームページ >バックエンド開発 >Python チュートリアル >「re.sub」が「re.MULTILINE」ですべての出現箇所を置き換えないのはなぜですか?

「re.sub」が「re.MULTILINE」ですべての出現箇所を置き換えないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-05 17:37:02617ブラウズ

Why Doesn't `re.sub` with `re.MULTILINE` Replace All Occurrences?

Python の re.MULTILINE フラグを使用した re.sub がすべての出現箇所を置換できない

Python のドキュメントには、re.MULTILINE フラグが次の場合に使用されることが記載されています。指定すると、文字列の先頭と各行の先頭で「^」パターンを一致させることができます。ただし、このフラグを re.sub とともに使用すると、複雑な動作が発生します。

次のコードを考えてみましょう:

<code class="python">import re

s = """// The quick brown fox.
... // Jumped over the lazy dog."""

print(re.sub('^//', '', s, re.MULTILINE))</code>

このコードは、次の場所にある「//」コメントをすべて削除することを目的としています。各行の先頭。ただし、出力では予期せず 1 つのオカレンスが変更されていません:

 The quick brown fox.
// Jumped over the lazy dog.

問題の理解

この動作の原因は、 re.sub関数。この引数は、フラグとしてではなく、置換する一致の数を指定することを目的としています。指定されたコードでは、re.MULTILINE (値が 8) がフラグではなくカウントとして使用されています。

コードの修正

問題を解決するには、次の 2 つのアプローチが考えられます。

  • 名前付き引数を使用する:
<code class="python">print(re.sub('^//', '', s, flags=re.MULTILINE))</code>
  • 正規表現第一:
<code class="python">print(re.sub(re.compile('^//', re.MULTILINE), '', s))</code>

これらのメソッドは両方とも re.MULTILINE をフラグとして正しく使用し、目的の動作をもたらします:

The quick brown fox.
Jumped over the lazy dog.

以上が「re.sub」が「re.MULTILINE」ですべての出現箇所を置き換えないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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