【Python】Pythonで正規表現を使う

Python正規表現を使う方法のまとめです。
正規表現を使う(マッチさせたり置換したりする)方法と、正規表現自体を作る方法に分けてまとめます。

python 3.7.2

【使い方】マッチする文字列を取得

#coding:utf-8
import re

target = r"exampleqwertyqwerty\n"
pattern = "qwe"

repattern = re.compile(pattern)
#result = repattern.match(target)  # match : 先頭からの一致をチェック
result = repattern.search(target)  # search : 一致する最初の一つを返す

# resultにはre.Match型が入ってくる
if result != None:  # 一致しなかったらresult == None
    print(result.group())  # マッチした文字列を取得
    print(result.start())  # マッチした文字列の開始indexを取得
    print(result.end())  # マッチした文字列の終了indexを取得
    print(result.span())  # マッチした文字列の(開始index, 終了index)のタプルを取得
else:
    print("該当なし")

【使い方】マッチする文字列をすべて取得

#coding:utf-8
import re

target = r"exampleqwertyqwerty\n"
pattern = "qwe"

repattern = re.compile(pattern)
results = repattern.findall(target)  # strのlistが得られる
for r in results:
    print(r)

【使い方】マッチする文字列を置換する

#coding:utf-8
import re

target = r"exampleqwertyqwerty\n"
pattern = "qwe"
repattern = re.compile(pattern)

result = repattern.sub("QWE", target)  # マッチする文字列をQWEに置換
print(result)  # str型

【作り方】まずは一文字を表現する

#coding:utf-8
import re

# .は「任意の一文字」を表す
pattern = "a.c"

# []でくくると「その中のいずれか一文字」を表す(集合)
pattern = "[abc]"

# こんな感じで範囲を指定することもできる
pattern = "[a-c]"

# 二文字の集合はこんな感じに書いてもOK
pattern = "a|b"

# いろんな集合の省略表記
pattern = "\d" # 数字の集合
pattern = "\D" # 数字以外の集合
pattern = "\s" # 空白文字の集合
pattern = "\S" # 空白文字以外の集合
pattern = "\w" # 英数字の集合
pattern = "\W" # 英数字以外の集合

repattern = re.compile(pattern)

【作り方】グループ化して文字列を表現

#coding:utf-8
import re

# ()でくくると文字列(グループ)を表す
pattern = "(abc)"

# 前節で作った一文字を組み合わせてグループを作れる
pattern = "(a[0-5]\D)"

repattern = re.compile(pattern)

【作り方】集合やグループを繰り返す

#coding:utf-8
import re

# *は「0回以上の繰り返し」を表す
pattern = "[a-c]*"
pattern = "(abc)*"

# +は「1回以上の繰り返し」を表す
pattern = "[a-c]+"
pattern = "(abc)+"

# ?は「0回または1回」を表す
pattern = "[a-c]?"
pattern = "(abc)?"

# {m}は「m回の繰り返し」を表す
pattern = "[a-c]{3}"
pattern = "(abc){3}"

# {m, n}は「m回~n回の繰り返し」を表す
pattern = "[a-c]{1,3}"
pattern = "(abc){1,3}"

repattern = re.compile(pattern)

【作り方】正規表現で日本語を使う

#coding:utf-8
import re

# 日本語の正規表現にはuを付ける
pattern = u"あ+"

# 日本語の集合表現
pattern = u"[ぁ-ん]" # ひらがな
pattern = u"[ァ-ン]" # カタカナ
pattern = u"[ぁ-んァ-ン]" # ひらがなとカタカナ

repattern = re.compile(pattern)

【作り方】その他の正規表現

#coding:utf-8
import re

# ^で「文字列の先頭」を表す
pattern = "^abc"

# $で「文字列の末尾」を表す
pattern = "abc$"

repattern = re.compile(pattern)

【作り方】改行をマッチさせる方法

普通に正規表現を使うと任意の一文字を表す「.」に改行は含まれません。
改行を含むには次のようにします。

#coding:utf-8
import re

# 改行を含む文字列
target = r'''abc
abc'''

# 正規表現
pattern = "abc."

# re.S引数を渡すと正規表現の「.」が改行も含むようになる
repattern = re.compile(pattern, re.S) # re.DOTALLと書いてもいい
if repattern.search(target) != None:
    print("matched.")
else:
    print("not matched.")

【作り方】なるべく少ない文字とマッチさせる

#coding:utf-8
import re

target = "abcabcabc"

# デフォルトはなるべく多い文字をマッチする -> abcabcabc
pattern = "(abc)+"

# ?をつけるとなるべく少ない文字とマッチする -> abc
pattern = "(abc)+?"

repattern = re.compile(pattern)
result = repattern.search(target)
if result != None:
    print(result.group())
else:
    print("not matched.")

参考

uxmilk.jp

qiita.com

uxmilk.jp

www.lifewithpython.com