시간을 기록하다

블로그 이미지
by 기록자
  • 27,842Total hit
  • 1Today hit
  • 10Yesterday hit

'Regular Expression'에 해당되는 글 3건

  1. 2009/06/06
    정규표현식(Regular Expression)을 이용한 Parsing Tip (1)
  2. 2009/05/20
    egrep 정규표현식 메타문자
  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#에서의 정규표현식에서는 최단일치를 할 수 있는 방법이 있었던것 같은데 안쓴지 오래되서 가물가물..;;

크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TRACKBACK 0 AND COMMENT 1
egrep(extended grep)은 grep 명령어의 좀더 확장된 버젼이라 할 수 있다. 다시 말하면, 좀 더 확장된 정규표현식을 메타 문자를 사용할 수 있다. 다만 grep에서 사용할 수 있었던 \{와 \{ 는 지원하지 않는다. 그러나 egrep에서 사용할 수 있는 메타 문자를 이용하면 훨씬 편리하게 정규표현식을 사용할 수 있다.


 메타문자 기능
사용 예
설명

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

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

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

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

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

[^ ]
문자집합에 속하지 않는 한 문자와 대응
'[^A-KM-Z]ove'
 A와 K 사이의 범위에 포함되지 않거나, M과 Z 사이에 포함되지 않는 한 문자와 ove가 붙어 있는 문자열과 대응

+
선행문자와 같은 문자의 1개 이상의 개수와 대응
'[a-z]+ove'
 a와 z 사이의 1개 이상의 문자와 ove가 붙어있는 문자열과 대응(ex: move, love, ...)

?
선행문자와 같은 문자의 0개 혹은 1개와 대응
'lo?ve'
 l 다음에 o가 0개 혹은 1개이고 ve가 붙어있는 문자열과 대응. love 혹은 lve.

a|b
a 혹은 b와 대응
'love|hate'
 love 혹은 hate와 대응

( )
정규표현식을 묶어준다
'lov(able|ely)'
'(ov)+'
lovable 혹은 lovely와 대응
ov가 한 번 이상 등장하는 문자열과 대응

개인적으로 처음으로 정규식을 사용하게 되었던게 C#에서 문자열 처리를 해야할 때였다. C#에서는 좀더 확장된 기능을 사용할 수 있어서 편리했던 것 같다(물론 큰 차이는 없지만...). egrep에 좀 더 익숙해지면 아마도 충분히 편리하게 사용할 수 있을 것 같다.
크리에이티브 커먼즈 라이선스
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회 사이의 횟수로 연속적으로 나타나는 문자열과 대응
저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.
TRACKBACK 0 AND COMMENT 0

ARTICLE CATEGORY

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

CALENDAR

«   2012/02   »
      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      

ARCHIVE

LINK