ホームページ > バックエンド開発 > Python チュートリアル > Python で数値を照合すると `re.findall` が空のリストを返すのはなぜですか?

Python で数値を照合すると `re.findall` が空のリストを返すのはなぜですか?

Barbara Streisand
リリース: 2024-12-27 01:20:10
オリジナル
785 人が閲覧しました

Why Does `re.findall` Return an Empty List When Matching Numbers in Python?

re.findall の動作に一貫性がない

re.findall を使用して文字列内の数値を照合しようとすると、一部のユーザーが予期しない動作に気づきました。 re.search は一致を正確に取得しますが、re.findall は空のリストを返します。この明らかな相違は、次の要因に起因すると考えられます。

グループのキャプチャと re.findall

覚えておくべき重要な点は、次の場合に re.findall がキャプチャされたテキストを取得することです。正規表現パターンにはキャプチャ グループが含まれています。リファレンスで定義されているように、パターンにキャプチャ グループが含まれている場合、 re.findall はグループのリストを返します。これは、複数のグループを持つパターンのタプルの形式で返される可能性があります。特に、別の一致の直前にない限り、空の一致も出力に含まれます。

非キャプチャ グループとリテラル エスケープ

提供された例では、特定のこの問題は、r'' 文字列リテラル内の \ の使用に起因します。この構造は、任意の 1 文字 (改行を除く) と一致するという本来の意味ではなく、リテラルと一致しようとします。数値を正しく一致させるには、パターンを次のように変更する必要があります:

-?\d*\.?\d+
ログイン後にコピー

このパターンには次のキャプチャ グループが含まれます:

  • -? - オプションのマイナス記号
  • d* - オプションの数字
  • 。 - オプションの小数点区切り文字
  • d - 1 つ以上の数字

デモ

これは、改訂されたパターンの 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート