'Study/AutoHotKey'에 해당되는 글 14건
- 2011.10.31 정규 표현식 강좌(Autohotkey)
정규 표현식 강좌(Autohotkey)
정규 표현식
정규 표현식은 컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 이 중 표준화된 것으로는 POSIX의 확장 정규 표현식이 있으며, 표준화되지는 않았지만 펄의 정규 표현식과 그 대체 구현인 PCRE도 널리 사용된다.
문법
몇몇 문자는 특정한 논리적 관계를 나타내는 기호로 쓰인다. 이를 제외한 나머지 문자는 일반적인 문자를 나타낸다.
- 선택 기호: "|" 기호는 여러 식 중에서 하나를 선택한다. 예를 들어, "abc|adc"는 abc라는 문자열과 adc라는 문자열을 모두 포함한다.
- 묶기 기호: "("와 ")"로 여러 식을 하나로 묶을 수 있다. "abc|adc"와 "a(b|d)c"는 같은 의미를 가진다.
- 개수 기호: 문자 뒤에 붙어 문자의 개수를 나타낸다.
- "*" : 0개 이상. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다.
- "+" : 1개 이상. "a+b"는 "ab", "aab", "aaab"를 포함하지만 "b"는 포함하지 않는다.
- "?" : 0개 또는 1개. "a?b"는 "b", "ab"를 포함한다.
- "{m, n}" : m개 이상 n개 이하. "a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다.
이에 따라 "(fa|mo|b?o)ther"는 "father", "mother", "bother", "other"를 나타낸다.
많은 프로그래밍 언어에서는 이를 확장한 문법을 가지고 있다. 이 중 일반적으로 사용되는 연산자는 다음과 같다.
- "[]" : "["과 "]" 사이의 문자 중 하나를 선택한다. "|"를 여러 개 쓴 것과 같은 의미를 가진다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 문자의 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 뜻한다.
- "[^]" : "[^"과 "]" 사이의 문자를 제외한 나머지 하나를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 나타낸다.
- "^", "$" : 각각 문자열의 처음과 끝을 나타낸다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
위키피디아에서는 위와 같이 설명하고 있습니다.
AutoHotkey의 정규 표현은, Perl 5의 정규 표현식과 그 대체 구현인 PCRE(Perl Compatible Regular Expressions)라고 하는군요.
정규식은 우리나라엔 없는 단어로 정규 표현식이라고도 하며, 영어의 regular expression를 번역해 놓은 것입니다.
텍스트 속에서 일정한 패턴을 찾아 컴퓨터가 알아듣기 쉽도록 수식화 해놓은 것이라 쉽게 이해하시면 됩니다.
예를 들어, "86년 아시아 게임, 88년 서울 올림픽, 98년 스타크래프트 대유행, 2011년 대찬인생 오핫사사 가입" 이라는 텍스트가 있다고 가정합니다.
여기서 볼수 있는 패턴은 무엇일까요? 86년, 88년, 98년이 연도를 표현하는 것이라는 것을 알 수 있습니다.
우리는 쉽게 알 수 있지만 컴퓨터는 어떻게 이것을 알아볼 수 있을까요?
컴퓨터에게 이것을 알려주기 위해 사용하는 것이 바로 "정규식" 입니다.
우리는 이것을 직접 상수를 찾아 일일이 변경해 줄 수 있습니다.
예) 찾기: 86년 -> 바꾸기: 1986년
이런것이 한줄이면 쉽겠지만 수백 수천줄이라면 어떻게 할까요? 86, 88, 98을 변수처럼 찾고 바꾸면 되지 않을까요?
AHK에서 그것을 가능하게 하는 명령어는 RegExMatch(), RegExReplace() 가 있습니다. 정규식을 이용한 검색과 치환은 이것으로 가능해 집니다. 자세한 것은 첨부파일의 레퍼런스를 참고 하시면 되겠습니다.
정규식으로 숫자두개+년으로 구성된 단어를 찾는것은 어떻게 할까요?
백번 듣는것 보다 한 번 해보는 것이 낫겠지요. 간단한 실습용 Gui를 작성하려고 했더니 이역시 이미 있더군요.
역시 누구도 상상하지 못한 새로운 것을 생각해 낸다는 것은 어려운 일인가 봅니다.
구글에서 검색하실 때 DotStar site:www.autohotkey.com 이런식으로 검색하시면 해당 사이트 내의 관련 단어만 검색해주니 관심 있으신 분은 직접 검색해보시면 되겠습니다. RegEx Tester라는 것도 있으니 우선은 입맛에 맞으시는 걸 찾으시길 바랍니다. DotStar는 첨부해 두었습니다.
위 그림에서 \b([0-9][0-9])년 이라고 쓴 곳이 정규식을 사용한 곳입니다.
[0-9]는 숫자를 찾으라는 것이고 \d라고 사용할 수도 있습니다. 두번 들어갔으니 두자리 숫자와 년이라는 글자가 합쳐진 패턴을 찾게 되겠네요.
그런데 2011년에도 11년이라는 패턴이 들어갑니다. 우리는 두자리 숫자에 19를 더해 1986년과 같은 형식을 만들고 싶은데 201911년이 되어 버리면 안되겠지요? 그래서 \b 라는 단어 구분자가 앞에 붙었습니다.
다르게는 \b(\d{2})\W. 라고 해도 \b([0-9][0-9])년 과 같은 결과를 얻을 수 있습니다.
여기서 설명하는 것들을 당장에 모두 이해하지 않아도 됩니다.
정규식에는 정답이 없으며 기본적인 것들만 익히면 누구나 어렵고 복잡한 수식을 만들어낼 수 있고 원하는 것을 검색하고 치환할 수 있습니다. 그것은 개인의 상상력에 달린 것이며 여러분의 상상력에 날개를 달아드리는 것이 이 글의 목적 입니다.
이미 다 이해하고 계신분들, 이 글을 보면서 이해하신 분들, 전혀 감이 안오시는 분들이 있을겁니다.
제가 아는 수준에서 최대한 쉽게 설명해 드릴테니 필요하신 분은 준비물(실습용 테스터와 레퍼런스)과 의지만 챙기셔서 따라오시면 됩니다.
http://www.autohotkey.pe.kr/bbs/board.php?bo_table=script&wr_id=300&page=9
이곳에 숫자를 어떻게 1000자리로 끊어 내느냐에 대한 여러 유저분들의 지난 고민들이 있습니다.
알아볼 수 없는 문자열의 조합들. 우리는 그런 것들이 어떻게 만들어지는가에 대한 근본적인 고민을 할 것이며 이야기가 끝날 때 쯤엔 위 링크의 내용을 이해하고 정규식을 마음대로 응용하게 되는 정도의 수준을 목표로 합니다.
그럼 뒷 이야기는 시간이 나는대로 계속 이어가겠습니다.
이 글의 목적은 어떤 방법으로 우리가 원하는 글자만 인식할 수 있는가와 그에 필요한 명령어 습득에 있습니다. |
이글은 autohotkey.pe.kr의 '대찬인생'님의 강좌 입니다.
'Study > AutoHotKey' 카테고리의 다른 글
특정 창에서만 단축키가 작동하도록 하는 방법 (0) | 2011.12.07 |
---|---|
한줄씩 입력 받기 (0) | 2011.10.20 |
한영 전환키 check (0) | 2011.10.18 |
Script> 좌표/색 도우미 (2) | 2011.10.17 |
AHK 자주사용하는 명령어 (0) | 2011.10.17 |
내장변수 (0) | 2011.10.10 |
키보드 스캔코드 (0) | 2011.10.10 |
Gui는 어렵다? (0) | 2011.10.09 |
정규 표현식 설명(예제포함) (0) | 2011.10.09 |
정규 표현식 (0) | 2011.10.09 |