시간을 기록하다

블로그 이미지
by 기록자
  • 18,092Total hit
  • 26Today hit
  • 33Yesterday hit

'정규표현식'에 해당되는 글 3건

  1. 2009/06/06
    정규표현식(Regular Expression)을 이용한 Parsing Tip
  2. 2009/05/15
    grep 명령어 옵션
  3. 2009/05/14
    리눅스 정규표현식과 메타문자
요즘 나는 업무상 필요에 의해서 perl을 공부하고 있다.
내가 생각하는 perl 의 장점은 간단한 코딩 몇 줄만으로도 상당한 위력을 발휘한다는 것이다.
그런 생각의 중심에는 바로 정규표현식이 있다.
사실 정규표현식을 사용할 수 있는 프로그래밍 언어는 여러가지 있지만, perl처럼 스크립트의 형식으로 사용하는 것에는 여러가지 장점이 있다고 생각한다.

오늘은 perl을 이용한 텍스트의 Parsing 에서 유용하게 활용할 수 있는 팁을 기록한다.

인터넷에는 수많은 문서들이 존재하며 그런 문서들을 수집하다보면 html 파일처럼 태그가 붙어 있는 문서들이 많이 있다.
오늘은 그러한 태그를 이용해 필요한 데이터를 추출할 때 사용할 수 있는 팁으로써 중첩된 동일한 태그에서 가장 안쪽의 데이터를 추출하는 방법이다.
사실 별것 아닌 방법이지만 어느날인가 KLDP에서 이 부분에 대해 해법을 찾지못하고 여러사람들이 방법들을 얘기하던 기억이 나서 적어두고자한다.

우선 아래의 예를 보면 두 개의 div 태그 안에 쌓여 있는 형태를 볼 수 있을 것이다.

aaa<div>bbb<div>123</div>ccc</div>ddd

위와 같은 경우 <div> 와 </div> 사이의 데이터를 찾고자 했을 때 다음과 같은 정규표현식을 사용할 수 있을 것이다.

/\<div\>.*?\<\/div\>/


하지만 위와 같은 형태로 데이터를 추출하면 아래와 같은 결과가 나온다

<div>bbb<div>123</div>

정규표현식의 처리 특성상 먼저 나타난 <div> 에 대해 위치를 찾아버리므로 당연한 결과이다.
하지만 우리가 원하는 데이터가 <div>123</div> 로써 태그의 형태상 가장 안쪽에 있는 것을 찾기 원한다면 어떻게 해야 할 것인가를 생각하지 않을 수 없다.

이런 경우 아래와 같은 형태의 reverse 함수와 그에 맞는 역패턴을 이용하는 방법이 쓸만하다.


이런 고민을 하고 있을법한 사람이라면 위의 코드내용에 대해서는 크게 어려운것이 없으니 쉽게 이해 할 것이라 생각하고 특별히 코드에 대한 설명은 하지 않겠다.

위의 코드를 실행하면 아래 그림과 같은 결과를 확인할 수 있을 것이다.


간단하면서도 단순하고, 또한 html 이나 xml 문서와 같이 구조가 있는 문서를 처리할 때 유용하게 사용할 수 있는 방법이라고 생각한다.

PS: 내가 기억하기로는 C#에서의 정규표현식에서는 최단일치를 할 수 있는 방법이 있었던것 같은데 안쓴지 오래되서 가물가물..;;

이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TRACKBACK 0 AND COMMENT 0

이번에는 지난번 리눅스 정규표현식과 메타문자에 대한 포스팅에 이어서 실제로 그러한 메타문자를 자주 사용하게 되는 grep 이라는 명령어에 대해 기록한다.
우선 grep 이라는 이름의 기원은 ex 문서 편집기에서 찾을 수 있다. ex 편집기를 사용하여 특정 문자열을 찾으려면 프롬프트에서 다음과 같이 입력하여야 한다.
: g/pattern/p
g(global)가 pattern 앞에 오면 파일의 모든 행을 검색한다. 여기서 p는 print 를 말하는 것이다. 검색 패턴을 정규표현식이라고 부르기도 하므로, pattern을 RE(regular expression)로 대신해서 명령어를 다음과 같이 표시할 수 있다.
: g/RE/p
이와같이 grep 이라는 이름의 의미만 알아도 grep 이라는 명령어가 하는 일을 대략 추측할 수 있다. grep은 정규표현식(RE)을 파일 전체(g)에서 찾아 해당 행을 출력(p)한다. grep을 쓸 때의 장점은 패턴 검색을 위해 편집기를 실행시킬 필요가 없을 뿐만 아니라, ex나 vi보다 속도가 훨씬 빠르다.

아래의 표는 grep 명령어를 사용할 때 쓰이는 몇가지 옵션들이다.


 옵션 설명

 -b  검색 결과의 각 행 앞에 검색된 위치의 블록 번호를 표시한다. 검색 내용이 디스크의 어디쯤 있는지 위치를 알아내는데 유용하다

 -c  검색 결과를 출력하는 대신, 찾아낸 행의 총수를 출력한다.

 -h  파일 이름을 출력하지 않는다.

 -i  대소문자 구분을 하지 않는다.

 -l  패턴이 존재하는 파일의 이름만 출력한다.

 -n  파일 내에서 행 번호를 함께 출력한다.

 -s  에러 메시지 외에는 출력하지 않는다. 종료 상태를 검사할 때 유용하게 쓸 수 있다.

 -v  패턴이 존재하지 않는 행만 출력한다.

 -w  패턴 표현식을 하나의 단어로 취급하여 검색한다. 즉 \< 와 \> 를 양쪽에 사용한 것과 같은 효과를 낸다. grep에서만 사용할 수 있다.


이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TRACKBACK 0 AND COMMENT 0
리눅스(유닉스)의 정규표현식과 메타 문자를 기록합니다.

먼저 정규표현식이란 문자들의 패턴이라고 할 수 있습니다. 리눅스(혹은 유닉스) 시스템의 대부분의 프로그램에서 정규표현식은 슬래시 사이에 옵니다. 예를 들어 /love/ 는 /와/로 둘러쌓인 정규표현식이라 할 수 있으며, 해당 명령은 검색 시 행에서 love라는 패턴과 일치하는 것을 찾으라는 것입니다. 아래의 표는 이러한 정규표현식에 사용되는 메타 문자와 사용 예를 간단히 정리해 기록합니다.


 메타 문자
 기능  사용 예
 설명

 ^  행의 시작 지시자  /^love/  love로 시작하는 모든 행과 대응

$  행의 끝 지시자  /love$/  love로 끝나는 모든 행과 대응

.
 하나의 문자와 대응  /L..e/  L 다음에 두 글자가 나오고 e로 끝나는 문자열을 포함하는 행과 대응

 *  선행 문자와 같은 문자의 0개 혹은 임의 개수와 대응  / *love/  임의 개수의 공백 문자 후에 love로 끝나는 문자열을 포함한 행과 대응

 []  []사이의 문자 집합 중 하나와 대응  /[Ll]ove/  love나 Love를 포함하는 행과 대응

[x-y]
 []사이의 문자 범위 내의 한 문자와 대응  /[A-Z]ove/  A부터 Z까지 한 문자가 ove로 끝나는 경우와 대응

[^]
 문자 집합에 속하지 않는 한 문자와 대응 /[^A-Z]/
 A와 Z 사이의 범위에 폼함되지 않는 한문자와 대응

 \  메타 문자로 사용하고 싶지 않은 경우  /love\./  love가 마침표(.)로 끝나는 경우와 대응

 \<
단어의 시작 지시자  /\<love/  love로 시작하는 단어를 포함하는 행과 대응

 \>
 단어의 끝 지시자  /love\>/  love로 끝나는 단어를 포함하는 행과 대응

\(..\)
 다음 사용을 위해 태그를 붙인다  /\(lov\)able\1er/  9개 태그를 쓸 수 있다. 왼쪽부터 순서대로 태그 번호가 매겨진다. 예를 들어, 패턴 lov는 태그 1에 저장되고, 뒤에는 \1 로써 태그 값을 사용할 수 있다. 왼쪽 예제에서 검색 패턴은 lovable에 lover가 붙어 있는 문자열이 된다.

 x\{m\}

x\{m,\}

 x\{m,n\}

 문자 x를 m번 반복한다

 적어도 m번 반복한다

m회 이상 n회 이하 반복한다
 o\{5,10\}  문자 o가 5회에서 10회 사이의 횟수로 연속적으로 나타나는 문자열과 대응
저작자 표시
이올린에 북마크하기(0) 이올린에 추천하기(0)
크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TRACKBACK 0 AND COMMENT 0

ARTICLE CATEGORY

분류 전체보기 (42)
개발 노트 (1)
초보의 알고리즘 (17)
프로그래밍 팁 (13)
기타 등등등등등 (11)

CALENDAR

«   2010/03   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

ARCHIVE

LINK