正規表現を何度も忘れて毎回調べてるのに嫌気がさしたので,チートシートを作った.完全に自分用.
開発環境
参考リンク
お世話になってるサイト集
-
- 正規表現一覧
- 記号が載ってる
- 基本的な正規表現一覧
- 記号とサンプルが載ってる
- マッチング正規表現サンプル集
- IPv4 アドレス,小数点数,時刻,日付など,身近なサンプルが載ってる
- 正規表現一覧
-
- note.nkmk.me | Python の正規表現マッチオブジェクトでマッチした文字列や位置を取得
- 良く使う
re.match
- 良く使う
- note.nkmk.me | Python の正規表現マッチオブジェクトでマッチした文字列や位置を取得
正規表現一覧
以下のリンクから抽出した.
基本的な正規表現
文字 | 説明 | 正規表現の例 | マッチする例 |
---|---|---|---|
. |
任意の 1 文字 にマッチする. | . |
A ,あ |
+ |
直前の文字が 1 回以上 繰り返す場合にマッチする.最長一致.条件に合う最長の部分に一致する. | go+gle |
goglego...gle |
* |
直前の文字が 0 回以上 繰り返す場合にマッチする.最長一致.条件に合う最長の部分に一致する. | go*gle |
gglego...gle |
? |
直前の文字が 0 個か 1 個 の場合にマッチする.最長一致.条件に合う最長の部分に一致する. | go?gle |
gglegogle |
+? |
直前の文字が 1 回以上 繰り返す場合にマッチする.最短一致.条件に合う最短の部分に一致する. | go+?gle |
goglego...gle |
*? |
直前の文字が 0 回以上 繰り返す場合にマッチする.最短一致.条件に合う最短の部分に一致する. | go*?gle |
gglego...gle |
?? |
直前の文字が 0 個か 1 個 の場合にマッチする.最短一致.条件に合う最短の部分に一致する. | go??gle |
gglegogle |
` | ` | いずれかの条件 (OR 条件) として使われる. | goog(le|ol) | google googol |
\ |
直後の正規表現記号(メタ文字)をエスケープ する. | go\+gle |
go+gle |
[...] |
角括弧に含まれるいずれか 1 文字にマッチする. | [abc] [a-c] |
a , b , c のいずれかの 1 文字 |
[^...] |
角括弧に含まれる文字以外にマッチする. | [^abc] [^a-c] |
a , b , c 以外の 1 文字 |
(...) |
文字を 1 つのグループにまとめることができる. | `goog(le | ol) | google, googol` |
{n} |
直前の文字の桁数を指定できる. | a{3} |
aaa |
{n,} |
直前の文字の最小桁数のみ指定できる. | a{3,} |
aaaaaaa... |
{n,m} |
直前の文字の最小桁数と最大桁数を指定できる.最長一致.条件に合う最長の部分に一致する. | a{3,4} |
aaaaaaa |
{n,m}? |
直前の文字の最小桁数と最大桁数を指定できる.最短一致.条件に合う最短の部分に一致する. | a{3,4}? |
aaaaaaa |
ここで使われている正規表現記号(「メタ文字」という)を 1 つの文字として扱いたい場合,\
でエスケープする必要がある.
定義済みの正規表現
文字 | 説明 | 対応する正規表現 |
---|---|---|
\t |
タブ | (なし) |
\r |
改行.CR(Carriage Return:0x0D) | (なし) |
\n |
改行.LF(Line Feed:0x0A) | (なし) |
\d |
すべての数字 | [0-9] |
\D |
すべての数字以外の文字 | [^0-9] |
\s |
垂直タブ以外のすべての空白文字 | [ \t\f\r\n] (半角スペースに注意) |
\S |
すべての非空白文字 | [^ \t\f\r\n] (半角スペースに注意) |
\w |
アルファベット,アンダーバー,数字 | [a-zA-Z_0-9] |
\W |
アルファベット,アンダーバー,数字以外の文字 | [^a-za-z_0-9] |
特定の位置関係の正規表現(まだ理解していない)
文字 | 説明 | 正規表現の例 | マッチする文字列 |
---|---|---|---|
^ |
直後の文字が行の 先頭 にある場合にマッチする. | ^google |
google... |
$ |
直前の文字が行の 末尾 にある場合にマッチする. | google\$ |
...google |
\< |
単語の先頭にマッチする. | \< |
*google |
\> |
単語の末尾にマッチする. | \> |
google* |
\b |
単語の先頭か末尾にマッチする. | \b |
*google* |
\B |
単語の先頭か末尾以外にマッチする. | \B |
google |
\A |
ファイルの先頭にマッチする. | \A |
(なし) |
\z |
ファイルの末尾にマッチする. | \z |
(なし) |
\G |
直前の一致文字列の末尾にマッチする. | \G |
(なし) |
置換文字列で使える表現
文字 | 説明 |
---|---|
\0 |
一致した文字列全体に置換する. |
\1 ~ \9 |
一致した文字列の 1 ~9番目に対応する文字列に置換する. |
\l |
次の 1 文字を小文字に変換する. |
\L ...\E |
挟まれた文字列を小文字に変換する. |
\u |
次の 1 文字を大文字に変換する. |
\U...\E |
挟まれた文字列を大文字に変換する. |
メタ文字のエスケープ
メタ文字をエスケープする例をいくつか挙げる
'^'
という文字を含まない文字列
'^'
という文字ではない文字の繰り返し
- 0 回以上:
[^\^]*
- 1 回以上:
[^\^]+
簡易サンプル集
アルファベット小文字,大文字のみ
- アルファベット
- 小文字のみ:
[a-z]
- 大文字のみ:
[A-Z]
- アルファベットのみ:
[a-zA-Z]
- 小文字のみ:
英数字のみ
- 英数字のみ:
[a-zA-Z0-9]
特定の文字を含まない文字の抽出
import re string = 'abcdef' pat1 = r'[a-z]'
サンプル集
サンプルは全て Python で書いている.
時刻とログを抽出
簡易的なログからです
import re # hh:mm:ss string = '[23:35:55] --- TypeError: can only join an iterble' # pattern = r'^\[([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\] --- ([\w:\s]+)$' pattern = r'^\[([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\] --- (.+)$' m = re.match(pattern=pattern, string=string) print('time:', m.group(1)) print('log:', m.group(2)) # time: 23:35:55 # log: TypeError: can only join an iterble
時刻と JSON ログを抽出
import re import json # hh:mm:ss string = '[23:35:55] --- {"msg": "TypeError: can only join an iterble"}' # pattern = r'^\[([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\] --- ([\w:\s]+)$' pattern = r'^\[([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\] --- (\{.+\})$' m = re.match(pattern=pattern, string=string) time = m.group(1) log_json_str = m.group(2) log_obj = json.loads(s=log_json_str) # json 文字列を辞書型に変換 print('time:', time) print('log:', log_obj['msg']) # time: 23:35:55 # log: TypeError: can only join an iterble