전체 페이지뷰

2016년 11월 30일 수요일

Regular Expression 공부를 시작하며...

regular expression에 대한 이미지 검색결과


정규표현식을 배울 것인가?

이것은 얼마 안되는 개발 공부 기간 내내 저를 괴롭히던 주제였습니다.
취미로 코딩을 하는 저에게 있어 이것은 들춰보기 싫은 장막이었고,
한편으로 늘 저를 제한하는 장벽 같은 것이었기 때문입니다.
마치, 넌 이건 몰라도 돼...라고 말하는 것 같아 자존심을 툭툭 건드렸다고나 할까요.
마침, 장고를 공부하던 중에 url을 정의하는 부분에서 마치 저를 시험하는 듯이 또 다시 슬쩍 정규표현식이 나타났기에 이 참에 닿는 곳까지 공부해 보려고 합니다.

 '정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.'
라고 위키에서 정의하고 있습니다.

Packt에서 무료배포시 받아놓은
'Mastering Python regular expressions'라는 책으로 공부를 진행해볼까 합니다.
(영어의 압박이...)

먼저 정규표현식의 일반론에 대해 알아보겠습니다.
정규 표현식을 통해서 우리는
특정표현의 유효성을 검사해볼 수도 있고(예를 들면 유효한 이메일 주소인가 하는 것같은),
문서 내에 특정 문자가 나타나는가를 조사해 볼 수도 있으며,
우편 번호와 같은 특정한 부분을 추출할 수도 있고,
점과 컴마 같은 것에 의해 문서를 쪼개 볼 수도 있을 것입니다.

정규표현식의 역사는 1943년, 신경 생리학자였던 Warren McCulloch와 Walter Pitts가 "A logical calculus of the ideas immanent in nervous activity"라는 논문에서 식과 신경계의 수학적 모델을 제시한 것으로부터 시작됩니다.

1956년에는 수학자 Stephen Kleene의 자신의 automata 관련 논문에서 regular set과 regular expression을 사용합니다.

12년이 지난 1968년에는 전설적인 컴퓨터 선구자가 Kleen의 논문을 가져다가 확장시켜,
Regular Expression Search Algorithm이라는 논문을 발표하니, 그가 바로 UNIX, B 언어, UTF-8 encoding 등으로 잘 알려진 Ken Thompson입니다.(정말 별걸 다 하신 양반입니다).

그는 단순히 논문을 쓰는 것에 그치지 않고, 그가 만든 편집기 QED에서 정규표현식을 지원하게 하였습니다. QED에서 정규표현식을 이용해 검색을 하려고 하면 다음과 같이 작성해야 했습니다.

 g/<regular expression>/p

g는 global search를 뜻하고, p는 print를 뜻합니다. regular expression의 약자로 re를 사용했으니 위의 문장은 g/re/p가 되고 이것이 UNIX 커맨드라인 툴인 grep의 시작입니다.

다음 주목할 업적은 Henry Spencer가 정규표현식 라이브러리를 구현한 것이며 이것이 Larry Wall이 Perl 언어의 mainstream에 정규표현식을  포함시키는 계기가 되었습니다.
IEEE(전기 전자 기술자 협회,Institute of Electrical and Electronics Engineers)는 정규표현식을 unicode로 지원하고 규격화하는 POSIX(이식 가능 운영체제 인터페이스, portable operating system interface 서로 다른 UNIX OS를 통합 관리하기 위한 ) standard를 고안하였습니다.

오늘날, 파이썬 정규표현식 모듈인 --re--는 펄 스타일의정규식만을 지원합니다.

정규표현식 문법



경험있는 개발자라면 다 누구나 조금씩 정규표현식을 사용해 왔습니다. 예를 들어 콘솔에서 *를 사용한다거나 검색에 ?를 사용하는 것이 그것인데요.
물음표는 파일명에서 문자 하나를 뜻하는 것입니다.
예를 들어 file?.xml은 file1.xml, file2.xml 같은 파일을 뜻하는 것입니다.(file99.xml은 아닙니다. 단일 문자만 치환하는 것이기 때문입니다.)
Asterisk(*)도 유사한데 다만 file*.xml이라고 하면 file99.xml까지 포함하여 'file'로 시작하고 '.xml'로 끝나는 모든 파일을 뜻하는 것입니다.
이 식에서 우리는 두가지 구성요소를 찾아볼수 있습니다.
하나는 literal(file과 .xml), 그리고 metacharacter(? 나 *)입니다.


앞으로 나오게 될 정규식도 이 두가지로 이루어져 있습니다.* 앞으로 나올 정규표현식에 / /이 등장하는데 이것은 QED 문법을 따른 것입니다. 따라서 향후 파이썬 문법에서는 등장하지 않습니다.
그리고 공백은 세기가 어려우므로 -->로 표시하기로 합니다.

위 그림에서 리터럴은 -->와 a이고, 메타캐릭터는 \w( _를 포함한 모든 문자,숫자를 뜻함)
그리고 *(0번 이상 발생하는 패턴, 다시 말해 무엇이 몇번 반복되던 상관 없음을 뜻함)입니다.

다음으로 Literal과 metacharacter에 대해 더 자세히 알아보겠습니다.



댓글 없음:

댓글 쓰기