プロメモグラム

誰が見てもわかるような文章を目指す

個人的に分かる範囲での正規表現

正規表現についての基本の基本を自分用にまとめる。
できるだけシンプルにまとめたかった。

他にもいろいろできるみたいだが、とりあえずはこれだけでもいろいろできそう。
ところどころ「・・・」とあるが、これは何か文字が入るという意味。

1文字の表し方

文字 概要
[・・・] 括弧内の文字の集合から1つ
[^・・・] 括弧内の文字以外の集合から1つ
[a-z] 小文字、大文字、数値など範囲した集合から1つ
. 任意の1文字
^ 行頭
$ 行末

バックスラッシュによる特殊な1文字

文字 概要
\d 数字(digit?)。[0-9]と等価。
\w 英数字(word?)
\s スペースまたはタブ
\t タブ
\n 改行
 [メタ文字] メタ文字そのものを文字として利用したいときに\でエスケープ

繰り返し系

文字 概要
{n} n回繰り返す
{m,n} mからn回繰り返す
+ 1回以上繰り返す
* 0回以上繰り返す
? 0回or1回。言い換えると省略可能な文字
+?, *? 最小マッチ。マッチする中で+や*の繰り返しが最小限のもの。

文字をまとめる括弧

文字 概要
(・・・) 文字をまとめる。言い換えると文字列。 キャプチャしたい時にまとまりとして使用。 キャプチャは後述。
(?:・・・) ()でまとめたいが、キャプチャしなくていいものを記録しない。
| 〜または〜。(abc|def)など。

キャプチャ

一致するものの中の一部を取り出すことができる。()を使って実現する。

# 言語100本ノックの22問目より。
import sys
import re

lines = ["[[Category:イギリス|*]]",
"[[Category:英連邦王国|*]]",
"[[Category:G8加盟国]]",
"[[Category:欧州連合加盟国]]",
"[[Category:海洋国家]]",
"[[Category:君主国]]",
"[[Category:島国|くれいとふりてん]]",
"[[Category:1801年に設立された州・地域]]"]


pattern = r'\[\[Category:(.*?)(\|.*)?\]\]'
for line in lines:
    for match in re.finditer(pattern, line):
        print(match.group(1))

()を2回使っているが、1つ目の括弧の中身がほしいので、group(1)で取り出している。
取り出し方は言語によって異なると思うが、大体は、1つ目、2つ目という感じで取れそう。