페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#4872

[Tutorial] 전화번호 검사 (정규식) 1s 128MB

문제

정규 표현식의 기본 개념

정규 표현식(Regular Expression, Regex)은 문자열에서 특정한 패턴을 찾거나 조작하는 방법이다.

기호

의미

예시

.

아무 문자 하나

"a.c""abc", "a1c", "a-c"

\d

숫자 (0~9)

"a\d""a1", "a5"

\w

알파벳/숫자/밑줄(_)

"\w+""abc123", "hello"

\s

공백 (스페이스, 탭, 개행 등)

"Hello\sWorld""Hello World"

+

앞의 문자가 1개 이상 반복됨

"\d+""123", "42"

*

앞의 문자가 0개 이상 반복됨

"\w*""", "abc"

?

앞의 문자가 0개 또는 1개

"\d?""", "4"

^

문장 시작

$

문장 끝

{n}

정확히 n번 반복

"\d{3}""123"

{n,m}

n~m번 반복

"\d{2,4}""12", "1234"

[]

괄호 안 문자 중 하나

"[abc]""a", "b", "c"

()

캡처 그룹(추출 대상 지정)

r"(\d{4})-(\d{2})-(\d{2})"

Character classes

.

any character except newline

\w \d \s

word, digit, whitespace

\W \D \S

not word, digit, whitespace

[abc]

any of a, b, or c

[^abc]

not a, b, or c

[a-g]

character between a & g

Anchors

^abc$

start / end of the string

\b \B

word, not-word boundary

Escaped characters

\. \* \\

escaped special characters

\t \n \r

tab, linefeed, carriage return

Groups & Lookaround

(abc)

capture group

\1

backreference to group #1

(?:abc)

non-capturing group

(?=abc)

positive lookahead

(?!abc)

negative lookahead

Quantifiers & Alternation

a* a+ a?

0 or more, 1 or more, 0 or 1

a{5} a{2,}

exactly five, two or more

a{1,3}

between one & three

a+? a{2,}?

match as few as possible

ab|cd

match ab or cd

  1. 자주 쓰는 함수

    함수/메서드

    설명

    반환 값

    re.compile(pattern, flags=0)

    패턴을 미리 컴파일하여 Pattern 객체로 반환. 반복 매칭 시 성능 향상 및 메서드 체이닝 가능.

    Pattern 객체

    Pattern.match(s)

    컴파일된 패턴을 사용하여 문자열 시작부터 매칭 검사

    매치 객체 또는 None

    Pattern.search(s)

    컴파일된 패턴을 사용하여 문자열 전체에서 최초 매칭 검색

    매치 객체 또는 None

    Pattern.findall(s)

    컴파일된 패턴으로 문자열 전체에서 모두 매칭되는 부분을 리스트로 반환

    문자열 리스트

    Pattern.finditer(s)

    컴파일된 패턴으로 문자열 전체에서 매칭 객체 이터레이터 반환

    매치 객체 이터레이터

    re.sub(pattern, repl, s, count=0)

    패턴과 일치하는 부분을 repl(대체 문자열)로 모두 변경한 새 문자열 반환

    대체된 새 문자열

  2. 사용법

    import re
    
    # 예제 문자열
    text = "문의: support@example.com, 연락처: 010-1234-5678, 작성일: 2025.07.18"
    
    # 1. re.match: 문자열 **시작**에서 패턴이 일치하는지 검사
    m = re.match(r'문의:\s+([\w\.-]+@[\w\.-]+\.\w+)', text)
    if m:
        # group(1): 첫 번째 괄호로 캡처된 이메일 주소
        print("re.match ▶ 이메일:", m.group(1))
    else:
        print("re.match ▶ 시작 부분에 이메일 없음")
    
    # 2. re.search: 문자열 **전체**에서 패턴을 **최초**로 찾음
    s = re.search(r'010-\d{4}-\d{4}', text)
    if s:
        print("re.search ▶ 전화번호:", s.group())  # group(): 매치된 전체 문자열
    else:
        print("re.search ▶ 전화번호 없음")
    
    # 3. re.findall: 문자열 전체에서 패턴과 **모두** 일치하는 부분을 리스트로 반환
    emails = re.findall(r'[\w\.-]+@[\w\.-]+\.\w+', text)
    print("re.findall ▶ 이메일 리스트:", emails)
    
    # 4. re.finditer: findall과 같으나 매치 객체(iterator) 반환
    print("re.finditer ▶ 매치 객체로 반복 출력:")
    for idx, match in enumerate(re.finditer(r'(\d{4})\.(\d{2})\.(\d{2})', text), start=1):
        # 매치된 전체 문자열과 캡처 그룹별 내용을 출력
        print(f"  {idx}. 전체: {match.group(0)}, 연도: {match.group(1)}, 월: {match.group(2)}, 일: {match.group(3)}")
    
    # 5. re.sub: 패턴에 일치하는 모든 부분을 대체 문자열로 변경
    # YYYY.MM.DD → DD/MM/YYYY 로 변환
    formatted = re.sub(
        r'(\d{4})\.(\d{2})\.(\d{2})',
        r'\3/\2/\1',
        text
    )
    print("re.sub ▶ 날짜 형식 변환:", formatted)

[문제]

두호는 회원들을 관리하고 있다.

 

회원들은 가입할 때 다양한 형식으로 전화번호를 입력하였는데,

올바르지 않은 형식으로 입력한 일부 회원들 때문에 고민 중이다.

 

도움을 요청한 두호를 위해 이 회원들 중 올바르게 전화번호를 입력한 회원들만 추려내어 출력해주는 프로그램을 작성하려고 한다.

 

올바른 전화번호의 기준은 (번호)-(번호)-(번호) 또는 (번호) (번호) (번호) 와 같이 하이픈 또는 공백을 기준으로 세 개의 숫자 그룹으로 나누어지며, 가운데 하이픈과 공백이 섞여있어도 가능하다.

 

예를 들어

010 1234 1234 는 올바른 전화번호이며

010-1234 1234 또는 010 1234-1234 도 올바른 전화번호이다.

 

또한 왼쪽 그룹의 번호는 2자리 또는 3자리로 이루어져 있어야 하며, 

가운데 그룹의 번호는 3자리 또는 4자리로 이루어져 있어야 하며,

오른쪽 그룹의 번호는 4자리로만 이루어져 있어야 올바른 전화번호라 한다.

 

예를들어 

1234-1234-1234 는 왼쪽 그룹의 번호가 4자리이기에 잘못된 전화번호이다.

123-12351-1234은 가운데 그룹의 번호가 5자리기 때문에 잘못된 전화번호이다.


입력

​첫 번째 줄에 회원의 수 N이 주어진다.

그 다음 N개의 줄에 걸쳐 이름 전화번호 형식으로 입력이 주어진다.

[힌트]

​input().strip().split(maxsplit=1) 

코드를 이용하여 왼쪽 기준으로 한번만 쪼갤 수 있다.


출력

입력받은 순서대로, 올바르게 전화번호를 입력한 회원들을 각 줄마다 이름 전화번호 형식으로 출력한다. 


예제

5

MyeongHee 010-3433-3423
Kwonsoo 011 113 232
Seohee 134-234-4113
Hyunbin 02 2344 3423
HyunDo 314 3412 343
MyeongHee 010-3433-3423

Seohee 134-234-4113
Hyunbin 02 2344 3423

로그인해야 코드를 작성할 수 있어요.