pyてよn日記

一寸先は闇が人生

正規表現チートシート

正規表現を何度も忘れて毎回調べてるのに嫌気がさしたので,チートシートを作った.完全に自分用.

開発環境

正規表現のサンプルは Python で書いた.

参考リンク

お世話になってるサイト集

正規表現一覧

以下のリンクから抽出した.

基本的な正規表現

文字 説明 正規表現の例 マッチする例
. 任意の 1 文字 にマッチする. .
+ 直前の文字が 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

参考書籍