正規表現
正規表現とは
文字列の集合をパターンで表現する方法。例えば、「bで始まってkで終わる2文字以上の文字列」は「b.*k」と表現できる。
よく使う正規表現
[ ]:角括弧に含まれるいずれか1文字
正規表現 | 意味 |
[ai] | “a”か“i”のいずれか1文字が該当する。 |
[0-9a-zA-Z] | 半角英数字のいずれか1文字が該当する。 |
[^0-9] | 数値以外の1文字が該当する。(^は否定の意) |
.:改行以外の任意の1文字
正規表現 | 意味 |
abc. | “abcd”や”abc9”のような“abc”で始まる任意の4文字が該当する。 |
^, $:行頭、行末
正規表現 | 意味 |
^abc | “abc~”など行頭に”abc”がある文字に該当する。”zabcなどは該当しない。 |
abc$ | “~abc”など行末に”abc”がある文字に該当する。”abcz”などは該当しない。 |
, +, ?:繰り返し
正規表現 | 意味 |
abc* | 直前の文字を0回以上の繰り返し。”ab”、”abc”、”abccc”などが該当する。 |
abc+ | 直前の文字を1回以上の繰り返し。”abc”、”abccc”などが該当する。 |
abc? | 直前の文字を0回か1回の繰り返し。”ab”、”abc”が該当する。 |
{}:繰り返し(繰り返す回数を指定)
正規表現 | 意味 |
[abc]{3} | 直前の文字を3回の繰り返し。”aaa”、”abb”、”abc”などが該当する。 |
[abc]{3, 5} | 直前の文字を3~5回の繰り返し。”aaa”、”abbc”、”abccc”などが該当する。 |
|:前後の文字いずれか1文字
正規表現 | 意味 |
[0-9]|[a-z] | 数値1文字か小文字の英字1文字が該当する。 |
特殊文字
.、+、*など正規表現で意味を持つ特殊な文字を単なる文字列として扱いたい場合は、\をつけてエスケープシーケンスとする必要がある。
正規表現 | 意味 |
\^ | 文字列の^ |
\$ | 文字列の$ |
\. | 文字列の. |
\+ | 文字列の+ |
\* | 文字列の* |
\/ | 文字列の/ |
\\ | 文字列の\ |
\[ | 文字列の[ |
\] | 文字列の] |
\{ | 文字列の{ |
\} | 文字列の} |
\( | 文字列の( |
\) | 文字列の) |
reモジュールを使ってみる
以下のようにコードを記述すると正規表現を使って取り出したい箇所のみを抽出できる。()を使ってグルーピングしておくと、groupsメソッドで対応する箇所の文字列を簡単に指定できる。
import re
s = "名前:かみ, 電話番号:070-0000-0000, メールアドレス:kami@example.com"
m = re.search(r"名前:(.*), 電話番号:(.*), メールアドレス:(.*)", s)
name = m.groups()[0]
phone = m.groups()[1]
email = m.groups()[2]
name, phone, email
# ('かみ', '070-0000-0000', 'kami@example.com')
pandasモジュールを使ってみる
pandasでもstr.extractなどを使うことで、正規表現を利用して指定の文字列を抽出できる。
import pandas as pd
df = pd.DataFrame({
"料金": ["1200円", "600円", "790円"],
"税率": ["8%", "10%", "8%"]
})
price = df["料金"].str.extract('([0-9]*)円').astype(int)
tax = df["税率"].str.extract('([0-9]*)%').astype(int)
df["価格"] = price * (1+tax/100)
df
# 料金 税率 価格
# 0 1200円 8% 1296.0
# 1 600円 10% 660.0
# 2 790円 8% 853.2