본문 바로가기
카테고리 없음

Python - 정규표현식 메타문자 []

by TREBOR 2019. 11. 4.

메타문자 [ ](대괄호, 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 (문자와 숫자가 아님) 로 대체 가능

 

댓글