Pythonにおける正規表現を使った文字列の操作について解説します。標準ライブラリの re
モジュールを使用することで、パターンにマッチした文字列を抽出したり置換を行うことができます。
ライブラリのインポート
re
モジュールを使用するには、re
をインポートします。
1 | import re |
文字列の先頭から一致するものを検索(match)
文字列の先頭からパターンに一致するものを検索するにはmatch()
メソッドを使用します。
matchでは文字列の先頭から検索しますので、文字列の途中に一致するものがあっても一致したとはみなされません。
1 2 3 | res = re.match(r'python', 'python-work.com') print(res) # <re.Match object; span=(0, 6), match='python'> |
結果はオブジェクトで返ってきます。span
に一致した文字列の範囲(開始位置, 終了位置)が入っており、match
に一致した文字列が入っています。
一致した文字列を取得するには group()
メソッドを指定します。
1 2 | print(res.group()) # python |
パターンに一致するものが無い場合や、先頭からの文字列に一致しない場合は、None
が返ります。
1 2 3 | res = re.match(r'work', 'python-work.com') print(res) # None |
検索パターン文字列には、正規表現の特殊記号を使用することができます。
1 2 3 | res = re.match(r'.*-work', 'python-work.com') print(res.group()) # python-work |
正規表現の主な特殊記号は以下になります。
開始 | ^ |
終了 | $ |
改行以外の一字 | . |
英字・小文字 | [a-z] |
英字・小文字 | [A-Z] |
数字 | [0-9] |
英数字 | [a-zA-Z0-9] |
スペース | s |
0回以上の繰り返し | * |
1回以上の繰り返し | + |
n回の繰り返し | {n} |
n回以上の繰り返し | {n,} |
n回以上m回以下の繰り返し | {n,m} |
省略可 | ? |
OR | | |
スペース以外の一字 | S |
文字列からパターンに一致するものを検索(search)
先頭に限らず、文字列の途中でもパターンに一致するものを検索する場合は search()
メソッドを使用します。
1 2 3 4 5 6 | res = re.search(r'work', 'python-work.com') print(res) # <re.Match object; span=(7, 11), match='work'> print(res.group()) # work |
searchではパターンに一致するものが複数あった場合でも、返ってくる結果は最小に一致したものだけになります。
1 2 3 | res = re.search(r'work', 'python-work.com is helpful for work') print(res) # <re.Match object; span=(7, 11), match='work'> |
全ての結果を取得したい場合は findall()
を使用します。
パターンに一致するもの全てを検索(findall)
文字列内でパターンに一致するもの全てを検索する場合は findall()
メソッドを使用します。結果はリストになります。
1 2 3 | res = re.findall(r'work', 'python-work.com is helpful for work') print(res) # ['work', 'work'] |
パターンに一致する文字で分割(split)
split()
メソッドを使用することで、指定したパターンに一致する文字列で分割することが可能です。結果はリストになります。
1 2 3 | res = re.split(r'-', 'python-work.com') print(res) # ['python', 'work.com'] |
パターンに一致した文字の置換(sub)
sub()
メソッドを使用することで、指定したパターンに一致する文字列を置換することができます。
1 2 3 | res = re.sub(r'-.*', ' programing', 'python-work.com') print(res) # python programing |
Pythonにおける正規表現を使った文字列の操作について解説しました。