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

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

Mary-Kate Olsen
リリース: 2024-12-29 13:21:11
オリジナル
835 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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