毎日ちょっとPython ~ 13日目 ~

毎日ちょっとなので、今日は本当にちょっと。だけどやります。
ここからは正規表現によるパターンマッチングだそうです。いいっすね

まず正規表現を使わないでテキストのパターンを検索

電話番号を検索することを考えましょう。実際はこんな感じになるはずです

def is_phone_number(text):
   if len(text) != 12: #文字列ピッタリ12文字かを確認する
       return False
   for i in range(0,3): #最初の三つが数字だけで構成されているかを確認
       if not text[i].isdecimal():
           return False
   if text[3] != '-': #4文字目が-(ハイフン)であるかを確認
       return False
   for i in range(4,7): #5~7文字目が数字だけかを確認する
       if not text[i].isdecimal():
           return False
   if text[7] != '-': #8文字目-(ハイフン)であるかを確認
       return False
   for i in range(8,12): #9~12文字目が数字だけかを確認する
       if not text[i].isdecimal():
           return False
   return True

print('415-555-4242は電話番号:')
print(is_phone_number('415-555-4242'))
print('Moshimoshiは電話番号:')
print(is_phone_number('Moshimoshi'))

で実行結果はこんな感じ。

415-555-4242は電話番号:
True
Moshimoshiは電話番号:
False

(書くの本当にめんどくさかった。

んで、ほかにもテキストの中から電話番号を見つける場合はどうするかというと最後の4行をこんな感じに変える

def is_phone_number(text):
   if len(text) != 12: #文字列ピッタリ12文字かを確認する
       return False
   for i in range(0,3): #最初の三つが数字だけで構成されているかを確認
       if not text[i].isdecimal():
           return False
   if text[3] != '-': #4文字目が-(ハイフン)であるかを確認
       return False
   for i in range(4,7): #5~7文字目が数字だけかを確認する
       if not text[i].isdecimal():
           return False
   if text[7] != '-': #8文字目-(ハイフン)であるかを確認
       return False
   for i in range(8,12): #9~12文字目が数字だけかを確認する
       if not text[i].isdecimal():
           return False
   return True


message = '明日415-555-1011に電話してください。オフィスは415-555-9999です。'
for i in range(len(message)):
   chunk = message[i:i+12]
   if is_phone_number(chunk):
       print('電話番号がみつかりました: ' + chunk)
print('完了')

こんな感じでやります。必ず12文字を切り出して取得するみたいな...

さっ、正規表現使いましょ。

正規表現で表すとこんな感じですー

\d\d\d-\d\d\d-\d\d\d\d
\d{3}-\d{3}-\d{4}

いいですねぇ!

んで、Pythonの正規表現関数は reモジュール の中にあります!インポートを忘れずに!

>>> import re
>>> phone_num_regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

r"文字列"のraw文字を使う理由はバックスラッシュの重ねがけが面倒だから。

もしr"文字列"じゃない場合は、

phone_num_regex = re.compile('\\d\\d\\d-\\d\\d\\d-\\d\\d\d\\d')

にしないといけないので、めんどくさいから最初にrつけようね。

で実際に利用すると、

>>> phone_num_regex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phone_num_regex.search('私の電話番号は415-555-4242です。')
>>> print('電話番号が見つかりました:' + mo.group())
電話番号が見つかりました:415-555-4242

search()
渡された文字列の中からマッチする部分を探します。なければNoneを返す。パターンが見つかればMatchオブジェクトを返します

group()
Matchオブジェクトにあるメソッドで、実際にマッチしたテキストを返します。

んで、moというのがMatchオブジェクトに用いられる汎用名らしい。
※こういうのが大事

正規表現マッチのまとめ

1. import reで正規表現モジュールをインポートする
2. re.compile()関数を呼び出しRegexオブジェクトを生成する(raw文字列を使う)。
3. Regexオブジェクトのsearch()メソッドに、検索対象の文字列を渡すと、Matchオブジェクトを返す
4. Matchオブジェクトの group() メソッドを呼び出し、実際にマッチした文字列を取得する

最後に

ふーむ。正規表現楽しみぃ

この記事が気に入ったらサポートをしてみませんか?