ホームページ >バックエンド開発 >Python チュートリアル >「re.findall」が重複する正規表現の一致を返さないのはなぜですか?先読みアサーションはどのようにしてこれを解決できるのでしょうか?

「re.findall」が重複する正規表現の一致を返さないのはなぜですか?先読みアサーションはどのようにしてこれを解決できるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 07:54:11892ブラウズ

Why Doesn't `re.findall` Return Overlapping Regex Matches, and How Can Lookahead Assertions Solve This?

重複する正規表現一致の発見: 先読みアサーションの詳細

問題:
re.findall を使用して正規表現パターンと一致する場合、重複する一致をすべて取得しないのはなぜですか?たとえば、文字列「hello」では、正規表現 r'ww' が「he」と「ll」にのみ一致し、「el」と「lo」には一致しないのはなぜですか?

答え:
デフォルトでは、re.findall は重複する一致を生成しません。これを実現するには、強力な正規表現機能である先読みアサーションを使用します。

解決策:

# Using a lookahead assertion
matches = re.findall(r'(?=(\w\w))', 'hello')

# Output: ['he', 'el', 'll', 'lo']

正規表現の (?=...) 構造は次のとおりです。先読みアサーション。指定されたパターンが現在位置の直後に出現する場合に一致しますが、文字列の文字は消費されません。この場合、文字を消費せずに、「hello」内のすべての 2 文字シーケンス (「ww」) を識別します。

説明:

  • 括弧式 (ww) は、一致する 2 文字のパターンを定義します。
  • (?=) はパターンの前にあり、 lookahead アサーション。
  • 正規表現引擎は、カーソルを「hello」に沿って移動し、次の 2 文字がパターン「ww」に一致するかどうかを継続的にチェックします。
  • 一致した場合は、現在位置を記録します。
  • このプロセスが続行され、重複する一致がすべて検出されます:「he」、「el」、「ll」、および「ほら。」

以上が「re.findall」が重複する正規表現の一致を返さないのはなぜですか?先読みアサーションはどのようにしてこれを解決できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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