4

import re(以下のすべてのコードは、既に評価されているコンテキストを想定しています。)

との違いに関するドキュメントでは、 runningとrunningre.matchre.search具体的に比較しています。実際のテストは1と比較することになるため、これは私には少しストローマンのように思えます。re.match(pattern, ...)re.search('^' + pattern, ...)re.match(pattern, ...)re.search(r'\A' + pattern, ...)

patternより具体的に言うと、私はとの組み合わせを簡単に思いつくことができませんstring

m = re.match(pattern, string)

の結果とは異なります。

m = re.search(r'\A' + pattern, string)

( の元のパターンがpatternたまたまタイプunicodeである場合、 の改訂されたパターンも同様であることに注意してくださいr'\A' + pattern。都合のよいことに注意してください。)

強調しておきますが、ここでは、パフォーマンスや利便性などの違いの可能性には関心がありません。現時点では、最終結果の違い (つまり、 の最終値の違い) のみに関心がありますm

質問をもう少し一般的に表現するとpatternflagsstring、などの組み合わせを探しているので、 inkwargsの最終値はm

r0 = re.compile(pattern, flags=flags)
m = r0.match(string, **kwargs)

minの最終値とは異なります

r1 = re.compile(r'\A' + pattern, flags=flags)
m = r1.search(string, **kwargs)

入力patternflagsstring、およびのそのような組み合わせはkwargs存在しない可能性がありますが、自信を持ってこのアサーションを行うには、Python の正規表現エンジンの内部に関する深い知識が必要です。IOW、「肯定的な答え」(つまり、説明されている入力の組み合わせが1 つだけからなるもの)とは対照的に、この質問に対する「否定的な答え」はかなり権威のある陳述になります。 (「肯定的な」回答よりも)はるかに深いレベルで作成されました。

要約すると、私は2つの可能な種類のいずれかの答えを探しています:

  1. patternflagsstring、およびの組み合わせは、上記の最後の 2 つのケースでkwargs異なる値を生成します。m
  2. Python の正規表現の内部に関する知識に基づく、信頼できる「否定的な」回答 (つまり、そのような入力の組み合わせは存在しません)。

1 \Aは、一致が複数行であるかどうかに関係なく、一致を文字列の先頭に固定します。ところで、\A文字列の終わりの一致に対応するのは\Zです。厄介なことに、Python のは Perl の に\Z対応し、Perl のに\zは対応していません\Z。この投稿の以前のバージョンを書いたとき、これは私をつまずかせました。(ところで、Pythonの正規表現\zには特別な意味はありません。一致するだけです。)私のエラーを見つけてくれたJohn Yzに感謝します。

4

1 に答える 1