ホームページ > バックエンド開発 > Python チュートリアル > 「re.search()」が一致を見つけたときに「re.findall()」が空のリストを返すのはなぜですか?

「re.search()」が一致を見つけたときに「re.findall()」が空のリストを返すのはなぜですか?

Linda Hamilton
リリース: 2024-12-19 09:23:09
オリジナル
118 人が閲覧しました

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall の動作

re.findall() 関数は、次の場合に期待した結果を返さない場合、混乱を招く可能性があります。文字列と一致します。特定のケースでの動作の背後にある理由を調べてみましょう。

問題ステートメント

次のソース文字列を考えてみましょう:

s = r'abc123d, hello 3.1415926, this is my book'
ログイン後にコピー

そして次のパターン:

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
ログイン後にコピー

re.search を使用すると、正しい結果:

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>
ログイン後にコピー

ただし、re.findall は空のリストを返します:

L = re.findall(pattern, s)
print(L)  # []
ログイン後にコピー

問題を理解する

2 つの重要な側面考慮:

  1. 空の一致キャプチャ グループ: re.findall は一致オブジェクトからキャプチャされたテキストを返しますが、このパターンではキャプチャ グループはありません。その結果、空の文字列が返されます。
  2. 文字エスケープ: \。パターン内の 2 つの文字、および改行を除く任意の文字と一致します。これは、数値の照合を目的としたものではありません。

解決策

数値を正しく照合するには、代わりに次のパターンを使用してください:

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

このパターン一致:

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

この修正されたパターンを使用すると、re.findall は期待されるリストを返します:

['123', '3.1415926']
ログイン後にコピー

以上が「re.search()」が一致を見つけたときに「re.findall()」が空のリストを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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