3
url = "http://www.domain.com/7464535"
match = re.search(r'\d*',url)
match.group(0)

'' を返します <----- 空の文字列

しかし

url = "http://www.domain.com/7464535"
match = re.search(r'\d+',url)
match.group(0)

「7464535」を返します

「+」は 1 以上、「*」は 0 以上だと思っていましたが、正しいでしょうか? そして、REは貪欲であるはずです。では、両方とも同じものを返さないのはなぜですか。さらに重要なことに、最初のものが何も返さないのはなぜですか?

4

1 に答える 1

9

+との意味については正しいです*。したがって\d*、0 個以上の数字に一致します — それがまさにそれを行っていることです。文字列の先頭から 0 桁に一致し、それから完了します。0 個以上の数字と一致しました。

*貪欲ですが、それは一致する場所でできるだけ多くの桁に一致することを意味するだけです. 文字列の後半で長いものを見つけようとして、一致をあきらめることはありません。


編集:正規表現エンジンの機能のより詳細な説明:

検索する文字列が"http://www.domain.com/7464535"で、パターンがの場合を考えてみましょう\d+

最初に、正規表現エンジンは URL の先頭と正規表現パターンの先頭を指しています。\d+は 1 つ以上の数字と一致する必要があるため、最初に正規表現エンジンが少なくとも 1 つの数字を見つけて一致させる必要があります。

最初に「h」文字を見つけます。これは数字ではないので、't' に移動し、次の 't' に移動し、最終的に '7' に到達するまで続きます。これで 1 つの数字が一致したので、「1 つ以上」の要件が満たされ、一致が成功する可能性+があります。 7'。したがって、文字列の最後にヒットし、その整数 '7464535' と一致します。

ここで、パターンが であったかどうかを考えてみましょう\d*。現在の唯一の違いは、ゼロ桁が有効な一致であることです。正規表現は左から右に一致するため、最初\d*に一致するのは文字列の最初の部分です。したがって、最初はゼロ長の一致がありますが、*貪欲であるため、数字がある限り一致が拡張されます。最初に検出されるのは非数字の 'h' であるため、長さゼロの一致が返されます。

では、長さゼロの一致が得られるだけで、どのように*役立つのでしょうか? 次のような構成ファイルと一致していたかどうかを検討してください。

foo: bar
baz:   quux
blah:blah

コロンの後に任意の量のスペース (ゼロでも) を許可したい。(\w+):\s*(\w+)where が\s*0 個以上のスペースに一致するような正規表現を使用します。パターン内のコロンの後に出現するため、文字列内のコロンの直後に一致し、長さ 0 の文字列 (blah:blahコロンの後の 'b' が一致を終了するため 3 行目) またはすべての文字列に一致します。*貪欲であるため、次の非スペースの前にスペースがあります。

于 2013-03-30T01:00:57.153 に答える