はじめに
文字列抽出・置換のための正規表現のチートシートをまとめました。
正規表現の書き方を忘れた場合に活用ください。
正規表現チートシート
基本のメタキャラクタ
任意の1文字や任意の半角数字などを指定することができます。
文字 | 意味 |
---|---|
. | 任意の1文字 |
\t | タブ |
\r | 改行(CR) |
\n | 改行(LF) |
\w | 英単語を構成する文字(a~z,A~Z,_,1~9) |
\W | 英単語を構成する文字以外 |
\s | 空白文字(半角スペース,タブ,改行,キャリッジリターン) |
\S | 空白文字以外 |
\d | 半角数字(0~9) |
\D | 半角数字以外 |
\b | 単語の境界に一致 |
[abc] | 指定された文字のどれかに一致(この場合abcのいずれかに一致) |
[a-z] | マッチする文字の範囲を指定する表現(この場合aからzまで他には[1-9][A-Z]など文字コードが連続していれば使える。) |
(pattern1|pattern2) | 指定されたパターンのどれかにマッチする表現 |
量指定子
文字の後ろに配置し、前の文字が何回出てくるのかを指定します。
文字 | 意味 |
---|---|
* | 0回以上の繰り返しにマッチ |
+ | 1回以上の繰り返しにマッチ |
{n} | n回の繰り返しにマッチする表現 |
{n,} | n回以上の繰り返しにマッチする表現 |
{n,m} | n回以上m回以下の繰り返しにマッチする表現 |
? | 0回または1回の出現にマッチする表現 |
アンカー
特定の文字が先頭、または、末尾にある文字列の場合に活用できます。
アンカー | 意味 |
---|---|
^pattern | 文字列の先頭にpatternがある文字列に一致 |
pattern$ | 文字列の末尾にpatternがある文字列に一致 |
活用例
利用用途の多いだろう置換内容をいくつか残しておきます。※追記予定
電話番号
0X-XXXX-XXXX
0XX-XXX-XXXX
0XXX-XX-XXXX
0XXXX-X-XXXX
^0([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4}$
メールアドレス
example@example.com
example1234@example.com
example-1.23_4.@example.com
[\w\-._]+@[\w\-._]+
URL
http://lusknote.com/
https://lusknote.com/page#index
https://lusknote.com?p1=p1&p2=p2
# パラメータまで取得
https?://[\w!\?/\+\-_~=;\.,\*&@#\$%\(\)'\[\]]+
# パラメータ前まで取得
https?://[\w/\.]+
指定した文字列を含まない1行
^(?!.*文字列).+$
^(?!.*[文字列]).+$
^(?!.*(文字列A|文字列B)).+$
pythonで利用する場合
ライブラリ
import re
文字列検索、抽出 : re.search(pattern, string)
条件一致する部分が複数ある場合は、最初の一致部分のみが返される。
re.search(r'[example]+', "example@example.com")
# <re.Match object; span=(0, 7), match='example'>
先頭から文字列検索、抽出 : re.match(pattern, string)
文字列の先頭から一致するかを調べる。
条件一致する部分が複数ある場合は、最初の一致部分のみが返される。
re.search(r'[example]+', "example@example.com")
# <re.Match object; span=(0, 7), match='example'>
文字列全体の検索、抽出 : re.fullmatch(pattern, string)
文字列全体が一致しているとマッチオブジェクトが返される。
そのため、完全一致していない場合None
が返される。
re.fullmatch(r'[example]+', "example@example.com")
# None
re.fullmatch(r'[example]+@[\w\.]+', "example@example.com")
# <re.Match object; span=(0, 19), match='example@example.com'>
文字列全体から一致する文字列を抽出 : re.findall(pattern, string)
一致するすべての部分文字列をリストにして返す。
re.findall(r'(example)+', "example@example.com")
# ['example', 'example']
文字列の置換 : re.sub(pattern, repl, string)
一致した部分を他の文字列に置換できる。
置換処理された文字列が返される。
re.sub(r'(example)+', "replace", "example@example.com")
# replace@replace.com
文字列の分割 : re.split(pattern, string)
パターンにマッチした部分で文字列を分割し、リストにして返す。
re.split(',', "1,2,3,4,5")
# ['1', '2', '3', '4', '5']
マッチオブジェクトから文字列を取得したい場合
match.group()
複数の場合は、引数を指定する match.group(1)
m = re.search(r'[example]+', "example@example.com")
# <re.Match object; span=(0, 7), match='example'>
m.group()
# example
まとめ
正規表現の基礎とPythonで正規表現を利用する方法をまとめてみました。
チートシートとしてブックマークして活用いただけると嬉しいです!