메타문자 [ ](대괄호, square bracket)를 활용한 정규식.
대괄호 안에 어떤 문자도 올 수 있으며, 대괄호 안에 들어간 문자열 중 한 개의 문자만 만족해도 매치된다.
예로, re.match("[abcdef]", "a")는 "a" 가 매치되고,
re.match("[abcdef]", "all") 역시 "a"가 매치되는 결과를 나타낸다.
아래는 여러가지의 예시.
print(re.match("[abcdef]","a")) # 결과: <re.Match object; span=(0, 1), match='a'>
print(re.match("[abcdef]","sky")) # 결과: None
print(re.match("[abcdef]","all")) # 결과: <re.Match object; span=(0, 1), match='a'>
print(re.match("[abcdef]","allall")) # 결과: <re.Match object; span=(0, 1), match='a'>
print(re.match("[abcdef]","aallall")) # 결과: <re.Match object; span=(0, 1), match='a'>
print(re.match("aallall","[abcdef]")) # 결과: None
print(re.match("aallall","[a]")) # 결과: None
판단할 문자열 내에 알파벳 소문자 / 대문자, 숫자가 있는지 여부를 확인할 때,
대괄호를 활용해 간단하게 확인할 수 있다.
알파벳 대문자의 경우[A-K], 소문자의 경우 [a-z], 숫자의 경우[0-9]로 나타낸다.
print(re.match("[A-K]", "a")) #None
print(re.match("[A-K]", "A")) #<re.Match object; span=(0, 1), match='A'>
print(re.match("[A-Ka-z]", "a")) #<re.Match object; span=(0, 1), match='a'>
print(re.match("[A-Ka-z]", "abcde")) #<re.Match object; span=(0, 1), match='a'>
마지막 예시에서 re.match함수가 match되는 문자열을 찾은 직후 검색을 중단하기 때문에 a만 출력된 것을 알 수 있음
이 때, 대괄호 후에 * 문자를 입력함으로써, 패턴에 일치하지 않는 문자열 전까지는 계속해서 검색할 수 있다.
아래는 예시
print(re.match("[A-Ka-z]*", "abcde")) ### *은 0개 이상 있는지를 판단하는 것
# <re.Match object; span=(0, 5), match='abcde'>
print(re.match("[A-Ka-z]*", "abcde1")) # <re.Match object; span=(0, 5), match='abcde'>
print(re.match("[A-Ka-z]*", "abc7de1")) # <re.Match object; span=(0, 3), match='abc'>
print(re.match("[A-Ka-z71]*", "abc7de1")) # <re.Match object; span=(0, 7), match='abc7de1'>
print(re.match("[A-Ka-z0-9]*", "abc7de1")) # <re.Match object; span=(0, 7), match='abc7de1'>
세번째 예시에서, [A-Ka-z]에 속하는 abc까지 검색 후, 패턴에 해당하지 않는 7이 등장하자 검색을 중단한 것을 알 수 있다.
그렇다면 대괄호 안에 포함된 문자를 제외하고 다른 문자가 등장했을 때에만 match되게 하려면 어떻게 할까?
이 때에는 ^ 문자를 활용할 수 있다.
print(re.match("[a-z]*", "abcde")) # <re.Match object; span=(0, 5), match='abcde'>
print(re.match("[^a-z]*", "abcde")) # <re.Match object; span=(0, 0), match=''>
print(re.match('[^0-9]','abc7de1')) # <re.Match object; span=(0, 1), match='a'>
print(re.match('[^0-9]','1abc7de1')) # None
print(re.match('[^0-9]*','abc7de1')) # <re.Match object; span=(0, 3), match='abc'>
알파벳/숫자를 활용한 패턴 정규식은 아래와 같이 대체할 수 있음
[0-9] <---> \d (숫자) 로 대체 가능
^[0-9] <---> \D (숫자가 아님)로 대체 가능
[a-zA-Z0-9] <---> \w (문자와 숫자) 로 대체 가능
[^a-zA-Z0-9] <---> \W (문자와 숫자가 아님) 로 대체 가능
댓글