【Python】正規表現(reモジュール)まとめ

プログラミング初心者の勉強ブログ #93

PyQ(https://pyq.jp/)によるPython学習記録です。Rubyを多少かじり、第二外国語としてPythonを少しづつ学んでいきます。(内容はRubyとの比較が多くなるかもしれません。)

今回は文字列から特定のパターンを探すときなどに用いる正規表現(reモジュール)についてです。Rubyで正規表現をサボっていたので、これを機にまとめます。

 

目次

[toc]

 

Pythonにおける正規表現の利用

Pythonでは正規表現を用いる際、「re」というモジュールをインポートして活用します。正規表現を用いることで文字列の並びをパターン化して表現することができ、より正確な文字列の検索や加工が行えるようになります。

test.py

import re

text1 = 'a1'
text2 = 'abcde12345'

# 「\w+」で1文字以上の単語文字、「\d+」で1文字以上の数字、「$」は末尾を表現
rep = '\w+\d+$'

# textとrepが一致しているかを判定
m1 = re.match(rep, text1)
m2 = re.match(rep, text2)

print(m1.group(0))
# --> 'a1'
print(m2.group(0))
# --> 'abcde12345'

変数repを「\w+\d+$」などの特殊文字や特殊シーケンスの組み合わせで定義することで、様々な文字列の並びをパターン化して利用することができます。

 

頻出正規表現

特殊文字

文字 内容
. 改行を除く何か1文字
^ 文字列の先頭
$ 文字列の末尾
* 前の文字の0文字以上
+ 前の文字の1文字以上
? 前の文字の0文字または1文字
{n} n個連続(nは数値)
\ 特殊文字のエスケープで使う
[ ] 集合([ ]内の文字のうち1文字)
[^ ] 集合の否定([ ]内の文字のうち1文字が含まれない)
| または
( ) キャプチャ(( )で囲った部分に該当する文字を.groupで取得できる)

 

シーケンス

シーケンス 内容
\d 任意の数字
\s 任意の空白文字(\t\nなど)
\w 任意のUnicode単語文字
\n エスケープシーケンス(タブ)、1文字として扱う
\t エスケープシーケンス(改行)、1文字として扱う

 

これら特殊文字とシーケンスを使い、文字列をパターンとして表現します。まだ他にもありますが、最低でもここにまとめたものを覚えると、今まで意味が分からなかった正規表現がある程度読めるようになります。使っていかないと覚えられません。

 

正規表現で利用する関数

re.match(arg1,  arg2)

2つの引数(以下arg1、arg2)を取り、arg1に「正規表現でパターン化させた文字列」、arg2に「対象となる文字列」を入れることでarg1のパターンにarg2の文字列が一致した場合、その文字列を返す関数。

test.py

import re

text = 'abcde12345'
rep = '\w+\d+$'

m = re.match(rep, text)

print(m2.group(0))
# --> 'abcde12345'

 

re.search(arg1, arg2)

2つの引数(以下arg1、arg2)を取り、arg1に「正規表現でパターン化させた文字列」、arg2に「対象となる文字列」を入れることでarg1のパターンに当てはまった部分を、arg2の文字列から取得できる関数。

test.py

import re

content = 'Hello, "WORLD!"'
m = re.search('".*"', content)

print(m.group(0))
# -->"WORLD!"

 

re.split(arg1, arg2)

2つの引数(以下arg1、arg2)を取り、arg1に「正規表現でパターン化させた文字列」、arg2に「対象となる文字列」を入れることでarg1で指定したパターンを区切り文字としてarg2の文字列を分割し、リストを返す関数。

test.py

import re

content = 'Hello, Hello, World! Hello'
m = re.split('[,!]', content)

print(m)
# -->"['Hello', ' Hello', ' World', ' Hello']"

 

キャプチャとgroupメソッド

例として載せたコードに

print(m.group(0))

という「group」メソッドを使いましたが、これを使うことで特殊文字「( )」を使ってキャプチャした文字列を取り出すことができます。

group(arg)

引数には数値が入る。引数で指定した数値によって取り出すことのできる文字列が変わる。

  • group(0):  マッチした文字列全て
  • group(1):  キャプチャで取得した1つ目の文字列
  • group(2):  キャプチャで取得した2つ目の文字列

…以下省略

test.py

import re

content = '"(Hello)", "(Hello, World!)" "(Hello.)"'
m = re.search('"(.*)"', content)

print(m.group(0))
# -->"Hello, World!"

print(m.group(1))
# -->Hello, World!

 

上の場合、( )でキャプチャをしているのはダブルクオーテーションの内側だけなので、group(1)の時はダブルクオーテーションが表示されません。
 

まとめ

正規表現は今までサボっていた部分だったのでPython学習を機にまとめました。正規表現は眺めているだけじゃまず覚えられなかったので、PyQで演習できてだいぶマシになった気がします。

以上ありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA