본문 바로가기
C.W.K.
Stream
Lesson 10 of 12 · published

전화번호

~8 min · phone, validation, international

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

전화번호 형식은 국가마다 달라

미국에서는 (415) 555-0199, 415-555-0199, +1 415 555 0199처럼 쓰고, 한국에서는 010-1234-5678이나 02-1234-5678을 사용해. 영국의 +44 7700 900123처럼 국가 번호와 국내 형식의 규칙도 제각각이야.

후보를 넓게 찾는 패턴

자유 텍스트에서 전화번호처럼 보이는 부분을 찾을 때는 다음처럼 넓은 패턴에서 시작할 수 있어.

\+?\d[\d\s().-]{7,}\d

더하기 기호는 선택 사항이고 처음과 끝은 숫자야. 그 사이에는 숫자, 공백, 괄호, 점, 하이픈을 일곱 글자 이상 허용해. 이 패턴은 후보를 찾을 뿐 실제 전화번호임을 검증하지 않아.

미국 번호만 받는 예시

^(?:\+1\s*)?(?:\(\d{3}\)|\d{3})[\s.-]?\d{3}[\s.-]?\d{4}$

선택적인 국가 번호 +1, 괄호로 감싸거나 그대로 쓴 지역 번호, 국번과 가입자 번호를 차례로 검사해. 허용할 지역이 정해진 서비스에서만 이런 국가별 패턴을 사용해.

실제 검증에는 libphonenumber를 사용해

Google의 libphonenumber는 국가별 번호 길이, 접두사, 형식 변형과 검증 규칙을 알고 있어. Python의 phonenumbers를 비롯해 JavaScript와 Java 등 여러 언어의 구현이 있어. 국제 전화번호를 받는 애플리케이션이라면 정규식 하나로 대신하려 하지 마.

후보 추출 뒤 숫자 수도 확인해

위의 느슨한 패턴은 일정 길이의 문자열을 찾지만 숫자가 몇 개인지는 보장하지 않아. 최소 숫자 개수가 필요하면 후보에서 숫자만 세어 조건을 확인하고, 이어서 국가별 규칙이나 libphonenumber로 검증해.

Code

전화번호 패턴·python
import re

# 넓게 후보 추출
PHONE_LOOSE = re.compile(r'\+?\d[\d\s().-]{7,}\d')
re.findall(PHONE_LOOSE, 'call (415) 555-0199 or +82 10-1234-5678')
# ['(415) 555-0199', '+82 10-1234-5678']

# 미국 번호만 검사
US_PHONE = re.compile(
    r'^(?:\+1\s*)?(?:\(\d{3}\)|\d{3})[\s.-]?\d{3}[\s.-]?\d{4}$'
)
bool(US_PHONE.fullmatch('(415) 555-0199'))   # True
bool(US_PHONE.fullmatch('415-555-0199'))     # True
bool(US_PHONE.fullmatch('+1 415 555 0199'))  # True
bool(US_PHONE.fullmatch('415-555'))          # False — 번호가 불완전함

# 실제 검증에는 전화번호 라이브러리 사용
# pip install phonenumbers
# import phonenumbers
# phone = phonenumbers.parse('+82 10-1234-5678', None)
# phonenumbers.is_valid_number(phone)  # True
# phonenumbers.format_number(phone, phonenumbers.PhoneNumberFormat.E164)
# # '+821012345678'

External links

Exercise

phonenumbers를 설치하고 서로 다른 형식의 전화번호 다섯 개를 검증해 봐. 같은 입력을 느슨한 정규식에도 적용한 뒤, 후보 추출과 실제 번호 검증의 결과가 어디서 달라지는지 기록해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.