【Python】文字列から数字だけを取り出す方法
こんにちは、にわこまです。
今回は、pythonで文字列から数字だけを取り出す方法を紹介します。「西暦などの文字列から数字だけを取り出して処理したい」などを解決することができます。
具体的には、「2020年」から「2020」を取り出すことができます。
誤字脱字など何かございましたら、ご連絡お願いいたします。
スポンサードサーチ
結論
正規表現操作のモジュール「re」のsub()を使う。
使い方
import re
s = "2020年"
result = re.sub(r"\D", "", s)
print(result)
# 実行結果
2020
re.sub()は、文字列を置換するための関数です。
「r”\D”」で数字以外を指定し、置換後の文字列を「””」とすることで、文字列から数字だけを取り出すことができます。
re.sub(第1引数, 第2引数, 第3引数)
第1引数 : 文字列内で置換させたい文字列
第2引数 : 置換後の文字列
第3引数 : 対象の文字列
デメリット
「re.sub()」で文字列から数字を取り出す方法にはデメリットがあります。複数の数字が文字列内にあるとき、その数字をひとつの文字列として取り出してしまうことです。例を以下で示します。
import re
s = "2020年1月1日"
result = re.sub(r"\D", "", s)
print(result)
# 実行結果
202011
「2020年1月1日」という文字列から「202011」という数字のみの文字列を抽出しました。
「re.sub()」では、「2020年1月1日」を「2020」、「1」、「1」のように分けて抽出することができません。
この解決方法を以下で紹介します。
re.sub()以外で文字列から数字を取り出す方法
正規表現操作の「re」モジュールのfindall()を使う。
使い方
import re
s = "2020年1月1日"
result = re.findall(r"\d+", s)
# より正確な書き方 → re.compile(r"\d+").findall(s)
print(result)
# 実行結果
['2020', '1', '1']
re.findall()は、指定した文字列とマッチする全ての部分文字列をリストで返す関数です。
「r”\d”」によって、数字を指定しています。「+」は、直前のパターンを1回以上繰り返すということを指定しています。(今回の場合は、数字が1回以上繰り返すという意味)
re.findall(第1引数, 第2引数)
第1引数 : 抜き出したい文字列のパターン
第2引数 : 対象文字列
ごり押しで数字を取り出す方法
番外編として、正規表現操作のモジュール「re」を使わずに、文字列から数字を取り出す方法を紹介します。この方法は、処理が遅いためおすすめしません。「こんな方法でも文字列から数字を抽出できるんだ」程度に思っていてください。
s = "2020年1月1日"
result = []
msg = ""
for i in s:
if(i in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]):
msg = msg + i
else:
result.append(msg)
msg = ""
print(result)
# 実行結果
['2020', '1', '1']
スポンサードサーチ
まとめ
今回は、pythonで文字列から数字だけを取り出す方法を紹介しました。最後に解決方法を以下に示します。
文字列に1つの数字がある場合は、re.sub()を使います。
import re
result = re.sub(r"\D", "", 対象の文字列)
# 例) result = re.sub(r"\D", "", "2020年")
# 実行結果) 2020
文字列に複数の数字がある場合は、re.findall()を使います。
import re
result = re.findall(r"\d+", 対象の文字列)
# 例) result = re.findall(r"\d+", "2020年1月1日")
# 実行結果) ["2020", "1", "1"]
最後までお読み頂きありがとうございます。
参考サイト
・ Pythonの正規表現モジュールreの使い方(match, search, subなど)
スポンサードサーチ