Python 正規表現の基礎

Python

Pythonで正規表現を使いたい場合の方法について説明しています。

基本的な使い方

  1. reモジュールをインポートします。
    import re
  2. 正規表現オブジェクト(パターンオブジェクト)を作成します。
    パターンオブジェクト = re.compile(r'正規表現')
    ※正規表現は、raw文字列で作成します。
  3. (オプション)パターンオブジェクトにフラグを設定します。
    フラグを設定することで、検索の挙動を調整することができます。
  4. 検索します。
    パターンオブジェクトの検索メソッドには、search、match、fullsearch、findallなどがあります。
    どのような違いがあるのかは、以下で試していきます。

パターンオブジェクトのフラグ

パターンオブジェクトに設定できるフラグの主だったものは以下のとおりです。

フラグ意味
re.I
re.IGNORECASE
大文字と小文字を区別しない。
re.M
re.MULTILINE
パターン文字’^’は、文字列の先頭、および、各行の先頭(改行の直後)でマッチします。(通常は、文字列の先頭でのみマッチ)
パターン文字’$’は、文字列の末尾、および、各行の末尾(改行の直前)でマッチします。(通常は、文字列の末尾でのみマッチ)
re.S
re.DOTALL
パターン文字’.’は、改行を含むあらゆる文字とマッチします。
指定しない場合、’.’は、改行とマッチしません。

searchの使用例

Pattern.search(検索対象の文字列[, pos[, endpos]])

検索対象の文字列を走査し、正規表現とマッチする最初の場所を探して、対応するマッチオブジェクトを返します。マッチしない場合、Noneを返します。
第2引数(オプション)は、検索の開始位置を指定します。
第3引数(オプション)は、検索の終了位置を指定します。

import re

contents = '012345678 123-4567 1234567 000-0000-0000'

pattern = re.compile(r'\d{3}-\d{4}')
match = pattern.search(contents)
print(match)
print(match[0])

>>> <re.Match object; span=(10, 18), match='123-4567'>
>>> 123-4567

マッチオブジェクトの表示結果のうち、span=(10, 18)は、マッチした部分が、検索対象の11文字目から18文字目の部分であることを指しています。
一致した部分は、インデックス指定で取り出すことが可能です。

matchの使用例

Pattern.match(検索対象の文字列[, pos[, endpos]])

検索対象の先頭でマッチする場合に、対応するマッチオブジェクトを返します。
マッチしない場合、Noneを返します。
第2引数(オプション)は、検索の開始位置を指定します。
第3引数(オプション)は、検索の終了位置を指定します。

import re

contents = '012345678 123-4567 1234567 000-0000-0000'

pattern = re.compile(r'\d{3}-\d{4}')
match = pattern.match(contents)
print(match)


contents = '987-6543 012345678 123-4567 1234567 000-0000-0000'

match = pattern.match(contents)
print(match)
print(match[0])

>>> None
>>> <re.Match object; span=(0, 8), match='987-6543'>
>>> 987-6543

1回目の検索では、ヒットしないためにNoneが返されています。
2回目の検索では、先頭にヒット対象が存在するためマッチオブジェクトが返されています。

fullsearchの使用例

Pattern.fullserch(検索対象の文字列[, pos[, endpos]])

検索対象全体が、正規表現とマッチする場合、対応するマッチオブジェクトを返します。
マッチしない場合、Noneを返します。
第2引数(オプション)は、検索の開始位置を指定します。
第3引数(オプション)は、検索の終了位置を指定します。

import re

contents = '123-4567 987-6543'

pattern = re.compile(r'\d{3}-\d{4}')
match = pattern.fullmatch(contents)
print(match)


contents = '123-4567'

match = pattern.fullmatch(contents)
print(match)
print(match[0])

>>> None
>>> <re.Match object; span=(0, 8), match='123-4567'>
>>> 123-4567

最初の検索では、正規表現で一致する部分が含まれていますが、余計な文字列が後ろにあるためにヒットしませんでした。
2回目の検索では、正規表現と文字列が完全一致しているためマッチオブジェクトが返されました。

findallの使用例

Pattern.findall(検索対象の文字列[, pos[, endpos]])

検索対象中のマッチするすべての結果を文字列のリストとして返します。
検索結果に重複したものが含まれる場合は、排除されます。

import re

contents = '123-4567 987-6543 abc-defg 019-2836'

pattern = re.compile(r'\d{3}-\d{4}')
match = pattern.findall(contents)
print(match)

>>> ['123-4567', '987-6543', '019-2836']

コメント

タイトルとURLをコピーしました