(Python) Regex: POSIX bracket-expression “character class”

제목이 모두 꼬부랑 말로 되어 버렸네.
허나, 번역은 불가능하다. 굳이 한다면 ‘대괄호 표현식’ 정도나 가능할까?

아무튼..
python3 에서, 다음과 같은 실험을 해봤다.

aa = '10. convention'
bb = '10. aoenutna'
cc = '10. 우하하하하'

import regex
regex.search('[:alpha:].*

bb 는 제대로 매칭을 했는데, aa 와 cc 는 매칭 결과 없음.
cc 는 한글(유니코드)라 그런가보다하고 생각할 수도 있지만, aa 는 왜? ‘convention’ 이 나와야 정상이 아닌가??

이 때문에 30분에서 한시간쯤, 검색도 하고, 갖고 있는 모든 책을 뒤져봤다.
답은, “Mastering Regual Expressions” 에서 찾을 수 있었다.

일반 Regex 에서 문자(알파벳)만을 매칭하기 위해선 a-zA-Z 를 사용한다. (비교: \w 는 문자와 숫자를 모두 포함한다.)
여기엔 두가지 주의할 점이 있다.

  • 첫번째는 한글등 유니코드는 매칭이 불가능하단 점.
  • 두번째는, 정확한 표현식은 [a-zA-Z] 로, 대괄호(괄호 안에 있는 것을 한개 매칭)를 넣어줘야 한다는 점이다.

두번째를 좀 더 파고들면 다음 사실을 알 수 있게 된다.
a-zA-Z 를 Posix 형식으로 바꾸면, [:alpha:] 가 된다!!
따라서, [a-zA-Z] 는 [[:alpha:]] 이었다는 사실.

그럼 애초에 위 파이썬 regex 식이 오류를 냈어야 하는데, 왜 어떤 건 되고 어떤 건 안된건지 모르겠다.
아무튼, 제대로, 다음과 같이 하면 아무런 오류가 발생하지 않는다.

regex.search('[[:alpha:]].*, aa)
regex.search('[:alpha:].*

거 참. 알 수가 없네 그려.

안녕하세요. 글 남겨주셔서 고맙습니다.