Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで文字列から数字を抽出する方法【isdigitと正規表現の使い分け】

正の整数だけを抽出するシンプルな方法

文字列に含まれる正の整数だけを取り出したい場合は、split()で空白ごとに文字列を分割し、isdigit()で各要素が数字のみで構成されているかを判定する方法が手軽です。

>>> s = 'h3110 23 cat 444.4 rabbit 11 2 dog'
>>> [int(x) for x in s.split() if x.isdigit()]
[23, 11, 2]

この方法では、すべてが数字で構成された要素だけが整数に変換されてリストに追加されます。そのため「h3110」のように文字と数字が混ざった語句や、「444.4」のような小数は抽出対象になりません。

負の数や小数にも対応するなら正規表現が最適

マイナスの値や小数点を含む数値も抽出したい場合は、reモジュールのfindall()に正規表現を組み合わせるのがベストな選択肢です。また、抽出した値は文字列のままにせず、int()float()で数値型へ変換しておくと、その後の計算や比較処理がスムーズに行えます。

>>> import re
>>> [float(s) for s in re.findall(r'-?\d+\.?\d*', 'he33.45llo -42 world 32 string 30')]
[33.45, -42.0, 32.0, 30.0]

正規表現パターンの解説

ここで使っているパターン r'-?\d+\.?\d*' の各要素の意味は次のとおりです。

  • -?:マイナス記号があればマッチ(なくてもOK)
  • \d+:1桁以上の数字にマッチ
  • \.?:小数点があればマッチ(省略可能)
  • \d*:小数点以下の数字に0桁以上マッチ

このパターン1つで、「33.45」のような小数、「-42」のような負の整数、「32」「30」のような通常の整数をまとめて抽出できます。

実装時の注意点

  • 元のコード例では変数名に str を使っていますが、これはPythonの組み込み型 str を上書きしてしまうため、実際の開発では避けるべきです。本記事の例では s などの別の変数名に置き換えています。
  • 「3.14.15」のように小数点が複数含まれる語句や、カンマ区切りの「1,000」などはこのパターンでは正しく扱えません。対象となるデータの形式に応じて、正規表現を適宜調整してください。
  1. Pythonで改行コードを基準に文字列を分割する方法

    Pythonで改行コードを基準に文字列を分割する方法 Pythonでは、文字列クラスに標準で用意されている splitlines() メソッドを使うことで、改行を区切りとして文字列を簡単にリストへ分割できます。ここでは、代表的な2つの方法とその違いを解説します。 1. splitlines() メソッドを使う方法 splitlines() は、改行の位置で文字列を自動的に分割し、各行を要素とするリストを返します。最もシンプルで推奨される方法です。 >>> some multi line string.splitlines() [some, multi line, strin

  2. Pythonで区切り文字(str)を指定して文字列を分割する方法

    Pythonで文字列を特定の区切り文字で分割する方法は、主に2つあります。1つは文字列クラスの組み込みメソッド split() を使う方法、もう1つは正規表現モジュール re の re.split() を使う方法です。それぞれの使い方を詳しく見ていきましょう。 split()メソッドで文字列を分割する PythonのStringクラスには split() というメソッドが用意されており、区切り文字をオプション引数として指定できます。引数を省略した場合、デフォルトの区切り文字は空白(ホワイトスペース)になります。 >>> aa-ab-ca.split(-) [aa, ab, c