文字クラスを使って色々な文字にマッチするパターンを記述する

Python で使用できる正規表現のメタ文字のひとつである文字クラスの使い方について解説します。文字クラスでは固定の文字列の他に、任意の一文字にマッチするパターンや、複数の候補のいずれか一つの文字にマッチするパターンを記述することができます。

(Last modified: )

記述した文字にマッチする

パターンの中に文字を記述した場合は、その文字そのものとマッチします。例えば次のようなパターンは D で始まり、次に E が続き、最後に F が続く文字列にマッチします。

r'DEF'

DEF や ODEF 、 DEFE などにマッチします。 DMEF や DE にはマッチしません。

DEFDEFG
〇 CDEF
✕ DMEF
✕ DE
サンプルコード

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'Sun')

print(bool(pattern.search('Today is Sunday')))
>> True
print(bool(pattern.search('The Sun rose')))
>> True
print(bool(pattern.search('Ham Sandwich')))
>> False

任意の一文字(.)

メタ文字のひとつであるドット(.)は改行以外の任意の一文字にマッチします。

.

例えば次のようなパターンは G で始まり、任意の一文字が続き、そのあとに P が続く文字列にマッチします。

r'G.P'

GMP や GDP にマッチします。 GEO や GP にはマッチしません。

GMPGDP
〇 AGOPB
✕ GEO
✕ GP

次のようなパターンは G で始まり、任意の二文字が続き、そのあとに P が続く文字列にマッチします。

r'G..P'

GLMP や G89P にマッチします。 GOP や GP にはマッチしません。

GLMPG89P
✕ GEP
✕ GP

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'S..d')

print(bool(pattern.search('Today is Sunday')))
>> True
print(bool(pattern.search('The Sun rose')))
>> False
print(bool(pattern.search('Ham Sandwich')))
>> True

角括弧の中の一文字([...])

角括弧([...])は角括弧の中に記述した複数の文字のいずれか一つにマッチさせる場合に使用するメタ文字です。

[...]

例えば次のようなパターンは D で始まり、 [ から ] の間に記述された E 、 F 、 G のいずれかの一文字が続き、そのあとに H が続く文字列にマッチします。

r'D[EFG]H'

DFH や DGH にマッチします。 DAH や DeH にはマッチしません。

DFH
〇 ADGHB
✕ DAH
✕ DeH

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'[sS]un')

print(bool(pattern.search('Today is Sunday')))
>> True
print(bool(pattern.search('The sun rose')))
>> True
print(bool(pattern.search('Ham Sandwich')))
>> False

角括弧の否定

角括弧([...])の先頭に否定を表すキャレット(^)を記述した場合、角括弧の中に記述した複数の文字のいずれにも一致しない場合にマッチします。

[^...]

例えば次のようなパターンは D で始まり、 [ から ] の間に記述された E 、 F 、 G のいずれにも一致しない一文字が続き、そのあとに H が続く文字列にマッチします。

r'D[EFG]H'

ご注意いただきたいのは ^ のすぐあとの文字だけを否定するのではなく、 [ から ] に記述されたすべての文字を否定します。

DAH や D7H にマッチします。 DEH や DHH にはマッチしません。

DAH
〇 anD7Hed
✕ DEH
✕ DHH

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'199[^01234]')

print(bool(pattern.search('My birthday is 1998/03/12')))
>> True
print(bool(pattern.search('Graduated in 1994')))
>> False
print(bool(pattern.search('It opened in 1996')))
>> True

角括弧の範囲指定

角括弧([...])の先頭に否定を表すキャレット(^)を記述した場合、角括弧の中に記述した複数の文字のいずれにも一致しない場合にマッチします。

[0-9]  0 から 9 までのいずれかの数値
[a-z]  a から z までのいずれかの文字
[A-Z]  A から Z までのいずれかの文字

例えば次の二つのパターンは同じ文字にマッチします。

r'[A-G]'
r'[ABCDEFG]'

[ から ] の中に複数の範囲を記述したり、通常の文字の指定と組み合わせることもできます。次のパターンは a から e 、 g 、 m 、 x から z までのいずれかの文字にマッチします。

r'[a-egmx-z]'
r'[abcdegmxyz]'

英数字のいずれかの文字にマッチするパターンとして次のような記述がよく使われます。

r'[0-9a-zA-Z]'

簡単なサンプルで試してみます。

import re

pattern = re.compile(r'199[0-6]')

print(bool(pattern.search('My birthday is 1998/03/12')))
>> False
print(bool(pattern.search('Graduated in 1994')))
>> True
print(bool(pattern.search('It opened in 1996')))
>> True

文字クラスの略記法

文字クラスでは [ から ] の中に文字の範囲を記述することで多くの文字の中のいずれかの文字とマッチするパターンを記述することができますが、特によく使用するものについては略記法が用意されています。 Python で利用可能な略記法は次の通りです。

\d  Unicode 10 進数字([0-9]とその他の数字)
\D  数字以外 [^\d]
\w  Unicode 単語文字([a-zA-Z0-9_]とその他の単語になるほとんどの文字)
\W  英数字とアンダーバー以外 [^\w]
\s  Unicode 空白文字([ \t\n\r\f\v]とその他の空白文字)
\S  空白文字以外 [^\s]

\D は \d の否定のように大文字のものは小文字のものの否定になっています。

ただし ASCII フラグが設定されている場合はより限定された範囲となります。

\d  [0-9]
\D  数字以外 [^\d]
\w  [a-zA-Z0-9_]
\W  英数字とアンダーバー以外 [^\w]
\s  [ \t\n\r\f\v]
\S  空白文字以外 [^\s]

任意の数字を表す場合には \d 、任意の文字を表す場合には \w が使用できます。

簡単なサンプルで試してみます。

import re

msg = '郵便番号は 456-7890 です'
pattern = re.compile(r'\d{3}-\d{4}')

result = pattern.search(msg)
if result :
    print(result.group(0))
else :
    print('Don\'t matched')

>> 456-7890

改行などの特殊な文字

改行やタブなどキーボードから入力できないような特殊な文字にマッチするパターンを記述するため、バックスラッシュ(\)と文字を組み合わせたメタ文字が用意されています。

\f         改ページ
\n         改行
\r         復帰
\t         タブ
\v         垂直タブ
\b         バックスページ (文字クラスの中のみ)
\a         端末ベル (BEL)
\xhh       16進数hhを持つASCII文字
\uxxxx     16ビットの16進数値xxxxを持つUnicode文字
\Uxxxxxxxx 32ビットの16進数値xxxxxxxxを持つUnicode文字
\N{name}   Unicode データベース中で名前 name を持つ文字

簡単なサンプルで試してみます。

import re

msg = """こんにちは。
今日のミーティングですが予定通りの時間に行います。
何か変更があれば連絡してください。"""

pattern = re.compile(r'。\n.')

result = pattern.search(msg)
if result :
    print(result.group(0))
else :
    print('Don\'t matched')

>> 。
>> 今

-- --

Python で使用できる正規表現のメタ文字のひとつである文字クラスの使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。