re.findall の動作に一貫性がない
re.findall を使用して文字列内の数値を照合しようとすると、一部のユーザーが予期しない動作に気づきました。 re.search は一致を正確に取得しますが、re.findall は空のリストを返します。この明らかな相違は、次の要因に起因すると考えられます。
グループのキャプチャと re.findall
覚えておくべき重要な点は、次の場合に re.findall がキャプチャされたテキストを取得することです。正規表現パターンにはキャプチャ グループが含まれています。リファレンスで定義されているように、パターンにキャプチャ グループが含まれている場合、 re.findall はグループのリストを返します。これは、複数のグループを持つパターンのタプルの形式で返される可能性があります。特に、別の一致の直前にない限り、空の一致も出力に含まれます。
非キャプチャ グループとリテラル エスケープ
提供された例では、特定のこの問題は、r'' 文字列リテラル内の \ の使用に起因します。この構造は、任意の 1 文字 (改行を除く) と一致するという本来の意味ではなく、リテラルと一致しようとします。数値を正しく一致させるには、パターンを次のように変更する必要があります:
-?\d*\.?\d+
このパターンには次のキャプチャ グループが含まれます:
デモ
これは、改訂されたパターンの IDEONE デモです:
import re s = r'abc123d, hello 3.1415926, this is my book' pattern = r'-?\d*\.?\d+' L = re.findall(pattern, s) print(L)
このパターンは、期待される数値一致のリストを正しく取得します。 ['123', '3.1415926'].
キャプチャ グループの性質とリテラル エスケープの適切な使用法を考慮することで、開発者は re.findall がスクリプトで意図したとおりに機能することを保証できます。
以上がPython で数値を照合すると `re.findall` が空のリストを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。