[Python] 正規表現で郵便番号を判定・抽出する方法

Pythonで正規表現を使用して郵便番号を判定・抽出するには、reモジュールを利用します。

日本の郵便番号は 123-4567 の形式で、3桁の数字と4桁の数字がハイフンで区切られています。

正規表現パターンは r'\d{3}-\d{4}' です。

re.match()re.search() を使って文字列から郵便番号を判定し、re.findall() で複数の郵便番号を抽出できます。

この記事でわかること
  • 日本の郵便番号の形式について
  • 正規表現を用いた判定方法
  • 複数の郵便番号の抽出方法
  • 異なる国の郵便番号の扱い
  • 郵便番号のバリデーションの実装方法

目次から探す

日本の郵便番号の形式

郵便番号の基本的なルール

日本の郵便番号は、7桁の数字で構成されており、通常は以下の形式で表記されます。

  • 3桁-4桁の形式(例:123-4567)
  • ハイフンなしの形式(例:1234567)

郵便番号は、地域を特定するために使用され、特定の住所に関連付けられています。

最初の3桁は、都道府県や市区町村を示し、残りの4桁は、より具体的な地域を示します。

郵便番号は、正確な配送を行うために重要な役割を果たしています。

郵便番号の例と非郵便番号の例

以下は、郵便番号の例と非郵便番号の例を示した表です。

スクロールできます
郵便番号の例非郵便番号の例
100-00011234-5678
150-0001123456
987-654312-3456
1234567ABC-1234

郵便番号は、必ず7桁の数字で構成されている必要があります。

ハイフンの有無にかかわらず、正しい形式であることが求められます。

郵便番号の形式に基づく正規表現の設計

郵便番号を判定するための正規表現は、以下のように設計できます。

  • ハイフンありの形式:^\d{3}-\d{4}$
  • ハイフンなしの形式:^\d{7}$

これらの正規表現は、郵便番号が正しい形式であるかどうかを確認するために使用されます。

具体的には、\dは数字を表し、{n}はn回の繰り返しを示します。

^は文字列の先頭、$は文字列の末尾を示します。

これにより、郵便番号全体が正しい形式であることを確認できます。

Pythonで郵便番号を判定する方法

re.match()を使った郵便番号の判定

re.match()関数は、文字列の先頭から正規表現にマッチするかどうかを判定します。

郵便番号の判定においては、以下のように使用します。

import re
def is_valid_postal_code(postal_code):
    pattern = r'^\d{3}-\d{4}$'  # ハイフンありの郵便番号のパターン
    return re.match(pattern, postal_code) is not None
# 使用例
print(is_valid_postal_code("100-0001"))  # True
print(is_valid_postal_code("1234567"))   # False

このコードでは、is_valid_postal_code関数が郵便番号を判定し、正しい形式であればTrueを返します。

True
False

re.search()を使った郵便番号の判定

re.search()関数は、文字列全体の中で正規表現にマッチする部分を検索します。

郵便番号が文字列のどこにあっても判定できるように、以下のように使用します。

import re
def contains_postal_code(text):
    pattern = r'\d{3}-\d{4}'  # ハイフンありの郵便番号のパターン
    return re.search(pattern, text) is not None
# 使用例
print(contains_postal_code("私の住所は100-0001です。"))  # True
print(contains_postal_code("住所はここにありません。"))  # False

このコードでは、contains_postal_code関数がテキスト内に郵便番号が含まれているかを判定します。

True
False

郵便番号のフォーマットが正しいか確認する方法

郵便番号のフォーマットが正しいか確認するためには、正規表現を用いて判定することが重要です。

以下のように、ハイフンありとハイフンなしの両方の形式を確認する関数を作成できます。

import re
def is_valid_postal_code_format(postal_code):
    pattern_hyphen = r'^\d{3}-\d{4}$'  # ハイフンあり
    pattern_no_hyphen = r'^\d{7}$'     # ハイフンなし
    return re.match(pattern_hyphen, postal_code) is not None or re.match(pattern_no_hyphen, postal_code) is not None
# 使用例
print(is_valid_postal_code_format("123-4567"))  # True
print(is_valid_postal_code_format("1234567"))   # True
print(is_valid_postal_code_format("1234-567"))   # False

このコードでは、is_valid_postal_code_format関数が郵便番号のフォーマットを確認し、正しい形式であればTrueを返します。

True
True
False

郵便番号の判定における注意点

郵便番号を判定する際には、以下の点に注意が必要です。

  • 形式の確認: 郵便番号は必ず7桁の数字で構成されている必要があります。

ハイフンの有無にかかわらず、正しい形式であることを確認する必要があります。

  • 文字列の前後の空白: 判定を行う前に、文字列の前後に空白が含まれていないか確認することが重要です。

strip()メソッドを使用して空白を取り除くことができます。

  • エラーハンドリング: 不正な入力に対して適切なエラーメッセージを表示することが望ましいです。

ユーザーにわかりやすいフィードバックを提供することが重要です。

Pythonで郵便番号を抽出する方法

re.findall()を使った郵便番号の抽出

re.findall()関数は、文字列内のすべてのマッチをリストとして返します。

郵便番号を抽出するためには、以下のように使用します。

import re
def extract_postal_codes(text):
    pattern = r'\d{3}-\d{4}'  # ハイフンありの郵便番号のパターン
    return re.findall(pattern, text)
# 使用例
text = "私の住所は100-0001と150-0002です。"
postal_codes = extract_postal_codes(text)
print(postal_codes)  # ['100-0001', '150-0002']

このコードでは、extract_postal_codes関数がテキスト内の郵便番号を抽出し、リストとして返します。

['100-0001', '150-0002']

複数の郵便番号を含むテキストからの抽出

複数の郵便番号が含まれるテキストから抽出する場合も、re.findall()を使用することで簡単に実現できます。

以下の例では、複数の郵便番号を含むテキストから抽出します。

import re
def extract_multiple_postal_codes(text):
    pattern = r'\d{3}-\d{4}'  # ハイフンありの郵便番号のパターン
    return re.findall(pattern, text)
# 使用例
text = "東京の郵便番号は100-0001、横浜は220-0001、名古屋は460-0001です。"
postal_codes = extract_multiple_postal_codes(text)
print(postal_codes)  # ['100-0001', '220-0001', '460-0001']

このコードでは、複数の郵便番号を含むテキストからすべての郵便番号を抽出します。

['100-0001', '220-0001', '460-0001']

郵便番号が含まれていない場合の処理

テキストに郵便番号が含まれていない場合、re.findall()は空のリストを返します。

これを考慮した処理を行うことが重要です。

以下のように実装できます。

import re
def extract_postal_codes_with_check(text):
    pattern = r'\d{3}-\d{4}'  # ハイフンありの郵便番号のパターン
    postal_codes = re.findall(pattern, text)
    if not postal_codes:
        return "郵便番号は見つかりませんでした。"
    return postal_codes
# 使用例
text_with_no_postal_code = "ここには郵便番号がありません。"
result = extract_postal_codes_with_check(text_with_no_postal_code)
print(result)  # 郵便番号は見つかりませんでした。

このコードでは、郵便番号が見つからなかった場合に適切なメッセージを返します。

郵便番号は見つかりませんでした。

抽出した郵便番号の後処理(リスト化、整形など)

抽出した郵便番号をリスト化した後、必要に応じて整形することができます。

例えば、ハイフンなしの形式に変換する場合は、以下のように実装できます。

import re
def extract_postal_codes(text):
    pattern = r'\d{3}-\d{4}'  # ハイフンありの郵便番号のパターン
    return re.findall(pattern, text)
def format_postal_codes(postal_codes):
    return [code.replace('-', '') for code in postal_codes]  # ハイフンを削除
# 使用例
text = "私の住所は100-0001と150-0002です。"
postal_codes = extract_postal_codes(text)
formatted_postal_codes = format_postal_codes(postal_codes)
print(formatted_postal_codes)  # ['1000001', '1500002']

このコードでは、抽出した郵便番号のリストからハイフンを削除し、整形されたリストを返します。

['1000001', '1500002']

このように、抽出した郵便番号に対して後処理を行うことで、必要な形式に整えることができます。

郵便番号のフォーマットに関する応用例

ハイフンなしの郵便番号を判定・抽出する方法

ハイフンなしの郵便番号を判定・抽出するためには、正規表現を用いて以下のように実装できます。

import re
def extract_postal_codes_no_hyphen(text):
    pattern = r'\d{7}'  # ハイフンなしの郵便番号のパターン
    return re.findall(pattern, text)
# 使用例
text = "私の住所は1234567と7654321です。"
postal_codes = extract_postal_codes_no_hyphen(text)
print(postal_codes)  # ['1234567', '7654321']

このコードでは、ハイフンなしの郵便番号を抽出し、リストとして返します。

['1234567', '7654321']

郵便番号の前後に余分な文字がある場合の処理

郵便番号の前後に余分な文字がある場合、正規表現を使用して郵便番号を抽出することができます。

以下のように実装します。

import re
def extract_postal_code_with_extra_chars(text):
    pattern = r'(\d{3}-\d{4}|\d{7})'  # ハイフンあり・なしの郵便番号のパターン
    return re.findall(pattern, text)
# 使用例
text = "住所は、ここに100-0001、または1234567があります。"
postal_codes = extract_postal_code_with_extra_chars(text)
print(postal_codes)  # ['100-0001', '1234567']

このコードでは、余分な文字があっても郵便番号を正しく抽出します。

['100-0001', '1234567']

郵便番号の形式が異なる国の郵便番号を判定する方法

異なる国の郵便番号を判定するためには、各国の郵便番号の形式に応じた正規表現を使用します。

以下は、アメリカの郵便番号(ZIPコード)を判定する例です。

import re
def is_valid_us_zip_code(zip_code):
    pattern = r'^\d{5}(-\d{4})?$'  # アメリカの郵便番号のパターン
    return re.match(pattern, zip_code) is not None
# 使用例
print(is_valid_us_zip_code("12345"))      # True
print(is_valid_us_zip_code("12345-6789")) # True
print(is_valid_us_zip_code("1234"))       # False

このコードでは、アメリカの郵便番号が正しい形式であるかを判定します。

True
True
False

郵便番号のバリデーションを行う関数の作成

郵便番号のバリデーションを行う関数を作成することで、正しい形式の郵便番号のみを受け入れることができます。

以下のように実装します。

import re
def validate_postal_code(postal_code):
    pattern_hyphen = r'^\d{3}-\d{4}$'  # ハイフンあり
    pattern_no_hyphen = r'^\d{7}$'     # ハイフンなし
    if re.match(pattern_hyphen, postal_code) or re.match(pattern_no_hyphen, postal_code):
        return True
    else:
        return False
# 使用例
print(validate_postal_code("100-0001"))  # True
print(validate_postal_code("1234567"))   # True
print(validate_postal_code("1234-567"))   # False

このコードでは、validate_postal_code関数が郵便番号のバリデーションを行い、正しい形式であればTrueを返します。

True
True
False

このように、郵便番号のフォーマットに関する応用例を通じて、さまざまなケースに対応した処理を実装することができます。

よくある質問

郵便番号のハイフンがない場合はどうすればいいですか?

ハイフンなしの郵便番号を扱う場合、正規表現を使用して判定や抽出を行うことができます。

具体的には、\d{7}というパターンを使用して、7桁の数字を持つ郵便番号を判定します。

ハイフンありの形式と併せて処理することで、両方の形式に対応できます。

例えば、以下のように実装できます。

import re
def is_valid_postal_code(postal_code):
    pattern_hyphen = r'^\d{3}-\d{4}$'  # ハイフンあり
    pattern_no_hyphen = r'^\d{7}$'     # ハイフンなし
    return re.match(pattern_hyphen, postal_code) is not None or re.match(pattern_no_hyphen, postal_code) is not None

郵便番号が複数ある場合、どのようにすべて抽出できますか?

複数の郵便番号を含むテキストからすべてを抽出するには、re.findall()関数を使用します。

この関数は、指定した正規表現にマッチするすべての部分をリストとして返します。

以下のように実装できます。

import re
def extract_postal_codes(text):
    pattern = r'\d{3}-\d{4}|\d{7}'  # ハイフンあり・なしの郵便番号のパターン
    return re.findall(pattern, text)

この関数を使用することで、テキスト内のすべての郵便番号を簡単に抽出できます。

郵便番号の形式が異なる国の郵便番号も判定できますか?

はい、郵便番号の形式が異なる国の郵便番号も判定できます。

各国の郵便番号には特有の形式があるため、それに応じた正規表現を作成する必要があります。

例えば、アメリカのZIPコードは5桁または5桁と4桁の組み合わせで構成されています。

以下のように実装できます。

import re
def is_valid_us_zip_code(zip_code):
    pattern = r'^\d{5}(-\d{4})?$'  # アメリカの郵便番号のパターン
    return re.match(pattern, zip_code) is not None

このように、国ごとに異なる郵便番号の形式に対応した正規表現を使用することで、さまざまな国の郵便番号を判定することが可能です。

まとめ

この記事では、Pythonを使用して日本の郵便番号を判定・抽出する方法について詳しく解説しました。

正規表現を活用することで、郵便番号の形式を確認したり、複数の郵便番号を含むテキストから必要な情報を抽出したりすることが可能です。

これらの技術を応用することで、さまざまな形式の郵便番号に対応したプログラムを作成することができるでしょう。

ぜひ、実際のプロジェクトや日常のプログラミングに役立ててみてください。

  • URLをコピーしました!
目次から探す