あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

Pythonで正規表現(re)を扱いたい(1)

Pythonに限らずプログラミングを学んでいると、
正規表現を学ぶ必要が出てきます。

一見すると、意味不明な言葉の単語の羅列ですが、
使いこなせるようになると非常に便利なツールとなります。

正規表現を学ぶには、

の二種類をわけて学ぶと効率的です。
また、正規表現モジュールも以下の3つに分けて学習するとわかりやすくなります。

ここでは最初の基本的な機能について説明します。

Python正規表現モジュール

Python正規表現モジュールはreです。
(標準モジュールですので、スグに使用可能です。)

reで使用するメソッドで基本的なものは4種類ありますが、
返す値に違いがあるので、区別して覚えると理解しやすくなります。

メソッド 戻り値
search MatchObject/None
match MatchObject/None
split リスト
findall リスト

match,search

matchとsearchの同じ所

どちらもMatchObjectを返します。
MatchObjectに関しては、以下の特性を覚えておけば大丈夫です。

  • ブール値Trueを持つ
  • .start().end()でマッチした開始位置と終了位置を返す
  • .span()で(開始位置,終了位置)のタプルを返す
  • .group()でマッチしたパターンを返す

searchとmatchはパターンに適合するものがなければNoneを返します。
マッチした場合も、返ってくるのはMatchObjectで、そこから.group()で文字列を取り出すところが戸惑いやすいかもしれません。

import re
reg = "ab"
text = "abaaaaaa"

re.match(reg,text)
# これはMatchObject
re.match(reg,text).group()
#'ab'
re.match(reg,text).span()
#(0,1)

matchとsearchの違い

matchとsearchの違いは、マッチする位置です。
matchは与えられた文字列の先頭がマッチした場合のみ、MatchObjectを返します。
searchは文字列の中の最初にマッチした位置のMatchObjectを返します。

split,findall

splitとfindallの区別

splitとfindallはマッチした文字列を格納したリストで返します。

この2つの違いはsplitはマッチした部分で分割したリストを返します。
(そのため、グループを使用しないかぎりマッチした値は帰りません)

マッチした部分が隣接している場合は、''が返ります。

対してfindallはマッチしたもののみを返します。

re.split("ab","ababaaaab")
#['','','aaa','']<=ababが隣接した部分は'',''になる

re.findall("ab","ababaaaab")
#['ab','ab','ab']