この記事では、正規表現(regex)という強力なツールを使わずに、Pythonの基本的な文字列操作だけで、テキスト内から特定のパターン(この場合は電話番号)を検索する方法について解説します。この手動のアプローチを理解することは、正規表現の有用性を知るための良い出発点となります。
パターンを検証する関数
まず、ある12文字の文字列が「000-000-0000
」という形式の電話番号であるかどうかを検証する関数を作成します。
この関数は、以下のルールを順番にチェックします。
- 文字列の長さが12文字であるか。
- 最初の3文字が数字であるか。
- 4文字目がハイフンであるか。
- 次の3文字が数字であるか。
- 8文字目がハイフンであるか。
- 最後の4文字が数字であるか。
上記の条件をすべて満たした場合のみTrue
を返します。
def is_phone_number_format(text):
if len(text) != 12:
return False
for i in range(0, 3):
if not text[i].isdecimal():
return False
if text[3] != '-':
return False
for i in range(4, 7):
if not text[i].isdecimal():
return False
if text[7] != '-':
return False
for i in range(8, 12):
if not text[i].isdecimal():
return False
return True
# 関数のテスト
print(f"「090-1234-5678」は電話番号形式か: {is_phone_number_format('090-1234-5678')}")
print(f"「Hello World」は電話番号形式か: {is_phone_number_format('Hello World')}")
テキスト全体からパターンを検索する
次に、このis_phone_number_format
関数を使って、より長い文章の中から電話番号をすべて見つけ出す処理を実装します。
文章の先頭から12文字ずつ切り出し(「スライディングウィンドウ」と呼ばれる手法)、その12文字の「チャンク」が電話番号の形式に一致するかどうかを判定していきます。
main_message = "明日、第一候補の090-1234-5678に連絡します。繋がらない場合は、第二候補の080-9999-8888までお願いします。"
# メッセージの長さだけループ
for i in range(len(main_message)):
# i番目から12文字を切り出す
chunk = main_message[i:i+12]
# 切り出したチャンクが電話番号形式か検証
if is_phone_number_format(chunk):
print(f"電話番号が見つかりました: {chunk}")
print("検索完了")
実行結果:
電話番号が見つかりました: 090-1234-5678
電話番号が見つかりました: 080-9999-8888
検索完了
この方法の限界
この手動でのパターン検索は、単純な形式には有効ですが、多くの限界があります。
例えば、 (090) 1234-5678
のように括弧やスペースが含まれる形式や、市外局番が2桁の場合など、少しでも形式が異なると対応できません。異なる形式に対応するためには、if
文による条件分岐を延々と追加する必要があり、コードは非常に複雑で、メンテナンスが困難になります。
まとめ
Pythonの基本的な機能だけでも、文字列から特定のパターンを見つけ出すことは可能です。しかし、この方法は非常に手間がかかり、少しでも複雑なパターンに対応しようとすると、コードが肥大化してしまいます。
このような問題をよりエレガントかつ効率的に解決するために、次世代のツールとして正規表現が存在します。