ホームページ >バックエンド開発 >Python チュートリアル >「re.findall()」が重複する正規表現一致を返さないのはなぜですか?それを修正するにはどうすればよいですか?

「re.findall()」が重複する正規表現一致を返さないのはなぜですか?それを修正するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 10:23:12413ブラウズ

Why Doesn't `re.findall()` Return Overlapping Regex Matches, and How Can I Fix It?

重複する正規表現一致をさらに詳しく調べる

正規表現の世界では、特定の一致が見つからない理由を理解するのは難しい場合があります。次の例を考えてみましょう:

match = re.findall(r'\w\w', 'hello')
print(match)

予想どおり、このスニペットは、2 文字シーケンスのパターンに一致する「he」と「ll」を含むリストを返します。ただし、同様にパターンに適合しているように見える 'el' と 'lo' がなぜ結果に含まれないのか疑問に思う人もいるかもしれません。

この動作は、re.findall 関数のデフォルトの動作に起因します。重複する一致は生成されません。言い換えれば、文字列に沿って移動し、特定のパターンに最初に一致するものだけを検索し、潜在的な重複は考慮しません。

この問題に対処するために、先読みアサーションを使用する賢い回避策があります。先読みアサーション (?=...) は、実際に文字列を消費せずにパターンと一致します。これにより、指定されたパターンを満たす重複する一致をすべて見つけることができます。

たとえば、先読みアサーションを使用して文字列 'hello' 内のすべての 2 文字シーケンスを見つけるには、次の式を使用できます。

re.findall(r'(?=(\w\w))', 'hello')

この式は、各 2 文字のシーケンスが正常に実行されると、['he'、'el'、'll'、'lo'] を含むリストを返します。

先読みアサーションとその実際の応用を理解すると、複雑なマッチング シナリオにおける正規表現の有効性を大幅に高めることができます。

以上が「re.findall()」が重複する正規表現一致を返さないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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