문제 1. 이메일 유효성 검사
1. 출제의도
- 문자형 자료형의 메소드를 사용할 수 있다.
- 조건문,반복문, 함수형을 완벽하게 이해하여 기능을 구현할 수 있다.
2. 배경
당신은 고객 데이터를 수집하고 정리하는 과정에 있습니다. 확인해보니 회원가입 시 이메일 유효성 검사가 기능으로 구현되어있지 않음을 확인했습니다. 이를 보완하기 위하여 이메일 유효성 검사 기능을 만들려고 합니다.
3. 요구사항
- 이메일은 ID와 골뱅이, 도메인 3가지 요소로 구성 되어있습니다.
- 이메일은 하나의 @ 기호를 포함해야하며, @ 기준으로 ID와 도메인으로 나눠집니다.
- ID는 어떠한 문자든 숫자든 허용됩니다. 최소한 1자리가 존재 해야합니다.
- 도메인 역시 어떠한 문자나 숫자를 허용합니다. 단, 접미사는 `.com `,` .co.kr `만 허용합니다.(문제풀이 편의성)
- 이메일 주소 리스트 `email_list` 를 입력받아 각 이메일의 유효성을 검사하는 함수 `check_email` 함수를 완성합니다.
- 유효한 이메일인 경우 “유효한 이메일입니다” 라고 출력합니다.
- 유효하지 않은 이메일인 경우 “유효하지 않은 이메일입니다.” 라고 출력하며 그 이유를 함께 출력합니다.
- ex) “ID가 누락”, “@ 가 누락”, “적절하지 않은 도메인”
4. Skeleton Code
email_list = [
"example@example.com", # 유효한 이메일
"yangbujang@email.co.kr", # 유효한 이메일
"iamhungry.com", # 틀린 이메일 -> @ 누락
"@da.com", # 틀린 이메일 -> ID 누락
"daislove@isnit", # 틀린 이메일 -> 도메인 잘못됨
]
def check_email(email_list):
'''
여기에 들어갈 코드를 작성하세요
'''
check_email(email_list)
5. 출력 예시
'''
유효한 이메일입니다: 'example@example.com'
유효한 이메일입니다: 'yangbujang@email.co.kr'
유효하지 않은 이메일입니다: 'iamhungry.com' 이유: '@가 누락'
유효하지 않은 이메일입니다: '@da.com' 이유: 'ID가 누락'
유효하지 않은 이메일입니다: 'daislove@isnit' 이유: '적절하지 않은 도메인'
'''
💡 문제 풀이
`처음풀이`
email_list = [
"example@example.com", # 유효한 이메일
"yangbujang@email.co.kr", # 유효한 이메일
"iamhungry.com", # 틀린 이메일 -> @ 누락
"@da.com", # 틀린 이메일 -> ID 누락
"daislove@isnit", # 틀린 이메일 -> 도메인 잘못됨
]
def check_email(email_list): # check_email이라는 함수 생성
for email in email_list:
if '@' not in email: # 이메일이 유효x '@가 누락'
print(f"유효하지 않은 이메일입니다: '{email}' 이유: @가 누락")
else:
id, domain = email.split('@')
if len(id) < 0: # 이메일이 유효x 'ID가 누락'
print(f"유효하지 않은 이메일입니다: '{email}' 이유: ID가 누락")
elif domain.endswith('.com') or domain.endswith('.co.kr') != True: # 이메일이 유효x '적절하지 않은 도메인'
print(f"유효하지 않은 이메일입니다: '{email}' 이유: 적절하지 않은 도메인")
else: # 이메일이 유효함
print(f"유효한 이메일입니다: '{email}'")
check_email(email_list)
`더 나은 풀이`
email_list = [
"example@example.com", # 유효한 이메일
"yangbujang@email.co.kr", # 유효한 이메일
"iamhungry.com", # 틀린 이메일 -> @ 누락
"@da.com", # 틀린 이메일 -> ID 누락
"daislove@isnit", # 틀린 이메일 -> 도메인 잘못됨
]
def check_email(email_list):
for email in email_list:
if '@' not in email: # @가 없는 경우
print(f"유효하지 않은 이메일입니다: '{email}' 이유: '@가 누락'")
continue
id, domain = email.split('@',1) # @ 기준으로 분리
if not id: # ID가 없는 경우
print(f"유효하지 않은 이메일입니다: '{email}' 이유: 'ID가 누락'")
continue
if not (domain.endswith('.com') or domain.endswith('.co.kr')): # 도메인이 잘못된 경우
print(f"유효하지 않은 이메일입니다: '{email}' 이유: '적절하지 않은 도메인'")
else: # 유효한 이메일
print(f"유효한 이메일입니다: '{email}'")
check_email(email_list)
- `if not` 활용
: if len(id) <0: 이 아닌 if not id:를 써서 id가 없는 경우를 표현할 수 있음 - `in` 활용 (특정 문자 포함 여부 체크)
: elif domain.endswith('.com') or domain.endswith('.co.kr') != True: 와 같이 !=True 구문 대신 if not (domain.endswith('.com') or domain.endswith('.co.kr')) 으로 깔끔하게 표현할 수 있음 - `continue` 활용
: 처음 if문에서 조건을 만족하면 아래 구문을 무시. elif로 계속 들여쓰기 하는 것보다 간단.
`오답노트`
- '@가 없는 경우'를 제일 우선 순위로 체크해야 했는데 아래쪽에 조건을 걸어서 세번째에 있던 "iamhungry.com"가 계속 처리 안 되고 오류났음
- 문법 복습 필요.. 'email_list 안에 있는 요소들에 대해서 확인을 할 것이고 그 요소는 @를 기준으로 id와 domain으로 나뉜다'는 걸 표현하기 위해 아래 구문을 쓰는데까지 진짜 오래 걸렸다..
for email in email_list:
id, domain = email.split('@') - if문에 or 걸어도 됨
- == True로 써야 하는데 =True로 써서 오류남
- 파이썬 `startswith()`, `endswith()` 함수 : 문자열 시작 문자, 끝 문자를 검색하는 함수
# 기본 형태
# 문자열A가 문자열X로 시작하는지 여부를 True / False 형식으로 반환하는 경우
문자열A.startswith(문자열X)
# 문자열B가 문자열Y로 끝나는지 여부를 True/False 형식으로 반환하는 경우
문자열B.endswith(문자열Y)
[Python] startswith(), endswith() : 문자열 시작 문자, 끝 문자로 검색하는 함수
* 본 포스팅은 Python 3.8.6, Jupyterlab >= 3.0 의 환경에서 만들어졌습니다. 1. startswith()...
blog.naver.com
- 파이썬 `split함수` : 문자열을 특정 구분자를 기준으로 나누는 함수
# split함수 기본 형태
나눌문자.split('나누는 기준이 될 문자',몇 번 나눌지 숫자)
# 올바른 경우
"name@example.com".split('@', 1) # 결과: ["name", "example.com"]
"name@example.com".split('@') # 결과: ["name", "example.com"]
# 잘못된 경우
"name@subdomain@example.com".split('@', 1) # 결과: ["name", "subdomain@example.com"]
"name@subdomain@example.com".split('@') # 결과: ["name", "subdomain", "example.com"]