파이썬에서 특정 문자열이 영문자, 숫자, 밑줄(_), 대시(-)로만 구성되어 있는지 확인해야 하는 경우가 자주 있습니다. 예를 들어 사용자 아이디나 파일명의 유효성을 검사할 때 유용합니다. 이러한 작업은 정규 표현식(Regular Expression)을 사용하면 간단하게 처리할 수 있습니다.
정규 표현식을 사용한 방법
허용된 문자만 포함되어 있는지 검증하려면 다음과 같은 정규 표현식 패턴을 사용할 수 있습니다: ^[A-Za-z0-9_-]*$. 이 패턴은 문자열의 시작(^)부터 끝($)까지 영문 대소문자, 숫자, 밑줄, 대시 외에 다른 문자가 하나도 없는지 확인합니다.
예제
import re
print(bool(re.match("^[A-Za-z0-9_-]*$", 'aValidString123--__')))
print(bool(re.match("^[A-Za-z0-9_-]*$", 'inv@lid')))
출력 결과
True
False
첫 번째 문자열은 허용된 문자로만 구성되어 있으므로 True가 반환되고, 두 번째 문자열은 '@'라는 허용되지 않은 문자를 포함하고 있어 False가 반환됩니다.
참고로 파이썬 3에서는 re.fullmatch() 함수를 사용하면 패턴 양 끝의 ^와 $ 기호 없이도 전체 문자열 매칭을 수행할 수 있어 더 깔끔한 코드를 작성할 수 있습니다.
import re
def is_valid_string(s):
return bool(re.fullmatch(r'[A-Za-z0-9_-]+', s))
print(is_valid_string('aValidString123--__')) # True
print(is_valid_string('inv@lid')) # False
집합(Set)을 사용한 방법
정규 표현식 대신 집합(Set) 자료형을 활용하는 방법도 있습니다. 허용하려는 문자들로 집합을 선언한 뒤, 검사할 문자열이 해당 집합의 부분집합(subset)인지 확인하면 됩니다.
예전 파이썬 2에서는 별도의 sets 모듈을 임포트해야 했지만, 현재는 내장 타입인 set을 직접 사용하는 것이 표준이므로 아래 예제처럼 작성하는 것이 좋습니다.
예제
allowed_chars = set('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-')
validationString = 'inv@lid'
if set(validationString).issubset(allowed_chars):
print(True)
else:
print(False)출력 결과
False
'inv@lid' 문자열에는 '@'가 포함되어 있어 허용된 문자 집합에 속하지 않으므로 False가 출력됩니다.
정리
두 방법 모두 동일한 결과를 제공하지만, 일반적으로는 정규 표현식 방식이 더 널리 사용되며 코드도 간결합니다. 반면 집합 방식은 로직이 직관적이라 초보자가 이해하기 쉽다는 장점이 있습니다. 유효성 검사 규칙이 복잡해질수록 정규 표현식이 확장성 면에서 유리하니, 상황에 맞게 적절한 방법을 선택하시기 바랍니다.