<aside> 💬 lv0, 정규표현식

전화번호 형식 변환

문제 설명

주어진 문자열에서 전화번호를 찾아 표준 형식으로 변환하는 함수를 작성해주세요. 전화번호는 10자리 또는 11자리 숫자(예: 01012345678, 03112345678)입니다. 변환된 형식은 XXX-XXXX-XXXX 형식이어야 합니다(예: 010-1234-5678, 031-1234-5678).


제한 사항


입출력 예

입력 (문자열) 출력 (변환된 전화번호 문자열)
"항상 여기로 연락주세요 01012345678." 항상 여기로 연락주세요 "Contact me at 010-1234-5678."
"제 전화번호는 0311234567, 06412345678 입니다." "제 전화번호는 031-1234-567, 064-1234-5678 입니다."
"No numbers here." "No numbers here."

입출력 설명

문자열 내의 전화번호가 표준 형식으로 변환됩니다. 문자열에 전화번호가 없는 경우 원본 문자열이 그대로 반환됩니다.

</aside>

😺 풀이 1. sub

import re

def solution(data):
    pattern = r"(\\d{3})(\\d{3,4})(\\d{4})" **#1 패턴 정의**
    return re.sub(pattern, r"\\1-\\2-\\3", data) **#2 sub 함수 사용**

단계별 풀이 전략

  1. 패턴 정의

    정규표현식을 통한 전화번호 패턴을 찾습니다. 이 때 (\\d{3}), (\\d{3,4}), (\\d{4})로 각각 그룹화를 하여 패턴을 정의합니다.

  2. sub 함수 사용

    (\\d{3})은 \1, (\\d{3,4})은 \2, (\\d{4})은 \3로 그룹화 패턴을 지칭해주고 있습니다. 이를 통해 sub 함수를 사용하여 반환합니다.

알아둬야 할 개념

re.sub

풀이 2. group

def solution(data):
    def format_phone_number(match): **#1 번호 길이에 따른 형식 지정**
        phone_number = match.group(0)
        if len(phone_number) == 10:
            return f"{phone_number[:3]}-{phone_number[3:7]}-{phone_number[7:]}"
        elif len(phone_number) == 11:
            return f"{phone_number[:3]}-{phone_number[3:7]}-{phone_number[7:]}"
        else:
            return phone_number

    
    pattern = re.compile(r'\\b\\d{10,11}\\b') **#2 패턴 지정**
    result = pattern.sub(format_phone_number, data) **#3 sub 함수 사용**

    return result **#4 결과 반환**

단계별 풀이 전략

  1. 번호 길이에 따른 형식 지정

    format_phone_number 함수를 만들어 주어진 전화번호를 받아서 형식을 지정합니다. 그 후, 번호의 길이에 따라 형식을 지정해줍니다.

  2. 패턴 정의

    패턴을 만들어 줍니다.

  3. sub 함수 사용

    re.sub 함수를 통해 패턴에 해당되는 부분을 찾고 반환합니다.

  4. 결과 반환

    결과를 반환합니다.

알아둬야 할 개념

group 함수