ホームページ >バックエンド開発 >Python チュートリアル >「re.search」は成功するのに、「re.findall」が文字列内の数値を検索できないのはなぜですか?

「re.search」は成功するのに、「re.findall」が文字列内の数値を検索できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-29 13:21:11838ブラウズ

Why Does `re.findall` Fail to Find Numbers in a String When `re.search` Succeeds?

re.findall が予期せぬ動作をする

以下に定義されている元の文字列とパターンを使用します。

s = r'abc123d, hello 3.1415926, this is my book'
pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'

re。 search は正確に一致を見つけますが、re.findall は空のリストを生成します。この動作は、['123', '3.1415926'] の予想される出力と矛盾しており、なぜ re.findall がこの結果を生成しないのかという疑問を引き起こします。

問題の理解

2 つの重要な考慮事項が関係しますここ:

  1. グループのキャプチャ: re.findall は、正規表現パターンにキャプチャ グループが含まれている場合に、キャプチャされたテキストのみを抽出して返します。
  2. リテラル バックスラッシュ マッチング: パターン内の \ は、意図した ではなく、リテラルとの一致を試みます。

正規表現の変更

これに対処するには、パターンを変更して、冗長なキャプチャ グループを削除し、番号を正しく一致させることができます。

pattern = r'-?\d*\.?\d+'

このパターンは次と一致します:

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

結果

この変更されたパターンを使用すると、re.findall は期待どおりの結果を生成します。出力:

import re
L = re.findall(pattern, s)
print(L)  # Output: ['123', '3.1415926']

以上が「re.search」は成功するのに、「re.findall」が文字列内の数値を検索できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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