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

  1. 2010.06.16 소스 다이어트의 적절한 예 (3)
  2. 2008.10.07 프로야구 순위 출력 (2)
  3. 2008.10.07 N번째로 발생하는 매치 찾기. (1)

Naver Perl Community & Study Cafe


2010.06.16 08:41

소스 다이어트의 적절한 예


얼마전 친한 동생이 웹페이지로부터 특정 정보를 가져오는 소스에 대해서

블로그에 적은적이 있습니다.

http://golee07.tistory.com/entry/TCPIP-Naver-Web-Parsing


간단히 말하면,

네이버에서 극장을 입력하면, 그 극장에서 상영되는 제목과 시간들을

파싱해서 나열하는 코드였는데,

정규표현식 없이 온리 C언어(소켓까지 포함)로 

약 300줄 가량 되는것을 확인하였습니다.


그래서 이런 예도 있다는걸 보여줄 겸,

perl 로 한번 다시 짜보게 되었습니다.



Windows Vim 으로 작업했고 소스는 아래와 같습니다.


총 14줄 :)



파싱이 잘 되는 것을 확인 할 수 있습니다 :)


보여주려고 짜 뒀다가 이제야 포스팅 하네요~

perl 가르쳐달라고 하는 동생의 모습이 눈에 선합니다 ^^;;



P.S.  C언어로 짜는게 나쁘다는것은 아닙니다.
     
       소켓으로 웹페이지에 접근함으로, 헤더에 어떤값이 들어간다던지 하는 부분들을 배울 수 있으며,
 
       문자열을 직접 파싱해야 됨으로 알고리즘에 대한 실력도 늘게 됩니다.

       제가 여기서 어필하고자 하는 부분은 
      
       조금더 단시간에 효율적으로 프로그램을 완성하는데 초점을 두었습니다.


신고
Trackback 1 Comment 3
2010.06.16 08:41

소스 다이어트의 적절한 예


얼마전 친한 동생이 웹페이지로부터 특정 정보를 가져오는 소스에 대해서

블로그에 적은적이 있습니다.

http://golee07.tistory.com/entry/TCPIP-Naver-Web-Parsing


간단히 말하면,

네이버에서 극장을 입력하면, 그 극장에서 상영되는 제목과 시간들을

파싱해서 나열하는 코드였는데,

정규표현식 없이 온리 C언어(소켓까지 포함)로 

약 300줄 가량 되는것을 확인하였습니다.


그래서 이런 예도 있다는걸 보여줄 겸,

perl 로 한번 다시 짜보게 되었습니다.



Windows Vim 으로 작업했고 소스는 아래와 같습니다.


총 14줄 :)



파싱이 잘 되는 것을 확인 할 수 있습니다 :)


보여주려고 짜 뒀다가 이제야 포스팅 하네요~

perl 가르쳐달라고 하는 동생의 모습이 눈에 선합니다 ^^;;



P.S.  C언어로 짜는게 나쁘다는것은 아닙니다.
     
       소켓으로 웹페이지에 접근함으로, 헤더에 어떤값이 들어간다던지 하는 부분들을 배울 수 있으며,
 
       문자열을 직접 파싱해야 됨으로 알고리즘에 대한 실력도 늘게 됩니다.

       제가 여기서 어필하고자 하는 부분은 
      
       조금더 단시간에 효율적으로 프로그램을 완성하는데 초점을 두었습니다.


신고
Trackback 1 Comment 3
2008.10.07 16:00

프로야구 순위 출력

얼마전 해커쏜에 참여하여 간단한 프로그램을 하나 만들었다.
그 당시 a3r0님께 많은 도움을 받아서 그것을 바로 흡수!!
타자 및 투수의 정보까지 처리하는 루틴까지 만들었던 기억이 난다.

 

소개하자면 일명 Baseball::KBO
한국야구위원회
(http://www.koreabaseball.com/ ) 참고하여 만들어 졌으며

사이트의 정보들을 LWP::Simple 모듈을 이용하여 웹에서 해당 정보들을 얻어온

정규식을 이용해서 원하는 정보들을 찾아 저장하는 형식으로 코드를 작성하였다.

 

그 뒤 GTK문서를 보고 적당한 예제가 하나 있어 그 예제를 참고하여
GUI모드로 구현을 해보았다. 소스는 허접하지만...
누군가 더 나은 코드를 코멘트로 적어 줄까 싶어 공개한다.

블로그를 시작한지 글을 8건이나 썼는데... 아직 코맨트가 하나도 남겨지지 않았다. ㅠㅠ

#!/usr/bin/perl
=doc
This example shows one way to colorize rows in a SimpleList.
The basic approach is to add a color attribute to the columns
in the TreeView
(remember that a SimpleList is a TreeView), and store the color information in a hidden column in the model. Since the Glib type system will be used to fetch the color attribute, the hidden column must be of type Gtk2::Gdk::Color, which requires us to add a custom column type to SimpleList. =cut use strict; use warnings; use Glib qw/TRUE FALSE/; use Gtk2 -init; use Gtk2::SimpleList; use Encode qw(decode); use LWP::Simple; # in gtk+ 2.0.x, the cell renderers don't have the cell_background_gdk # property, so this test doesn't work right and spews messages. object # properties require no extra binding glue, so if you've upgraded to # gtk+ 2.2.x or newer after installing Gtk2-Perl, this test will magically # start to work. thus, this is one of those rare times when we need to # use the lower-case runtime version check. my $page; my $url = 'http://www.koreabaseball.com/record/standings.asp'; # 순위 $page = LWP::Simple::get($url); $page =~ m{<tr class="style26">(.*?)<tr>}s; #정규식을 사용하여 목록을 저장 my $menu = $1; my @menu = $menu =~ m{>(.*?)</td>}g; sub _d { decode("cp-949", shift) }; #한글 사용을 위한 decode



my
$msg = Gtk2->check_version (2,2,0); die "This example requires gtk+ 2.2.0, but we're linked against " . join (".", Gtk2->get_version_info)."\n" . "$msg\n" if $msg; # add a new hidden column that holds a Gtk2::Gdk::Color. Gtk2::SimpleList->add_column_type( 'color', type => 'Gtk2::Gdk::Color', renderer => 'Gtk2::CellRendererText', attr => 'hidden', ); #배열의 값들을 순서대로 넣어서 객체를 생성 my $slist = Gtk2::SimpleList->new ( _d($menu[0]) => 'int', _d($menu[1]) => 'text', _d($menu[2]) => 'text', _d($menu[3]) => 'text', _d($menu[4]) => 'text', _d($menu[5]) => 'text', _d($menu[6]) => 'text', _d($menu[7]) => 'text', _d($menu[8]) => 'text', _d($menu[9]) => 'text', _d($menu[10]) => 'text', 'row color' => 'color', ); # add a color attribute to each column, getting the color information # from the hidden column. # foreach my $col ($slist->get_columns) { foreach my $cell ($col->get_cell_renderers) { $col->add_attribute ($cell, cell_background_gdk => 11); }#여기서 객체의 수를 잘 명시 해 주어야 한다. 이걸 안해줘서 고생... ㅡ.ㅠ }
# now put some data into the list; note the data for the hidden column. # we'll leave a couple of rows uncolored.

# 정규식을 사용하여 값을 읽어와서 출력
$page =~ m{<table width="715" border="0" cellpadding="0" cellspacing="1" bgcolor="dcdcdc">(.*?)</table>}s; my $str = $1; my @array = $str =~ m{<tr class="style9" bgcolor="#f9f9f9">(.*?)</tr>}sg; my $x=0; foreach my $str2 (@array) { my @array2 = $str2 =~ m{>(.*?)</td>}g; my $y = 0; foreach my $str3 (@array2){ if($y==0){ ${$slist->{data}}[$x] = $x+1; }else{ ${$slist->{data}}[$x]->[$y] = _d($str3); }
         $y++;	
	if($y==11 && $x%2){
	${$slist->{data}}[$x]->[$y]	= Gtk2::Gdk::Color->new (0xFFFF, 0xFFFF, 0xCCCC)
	} #짝수에만 베이지 색을 넣었음
  }
  $x++;
}
# the rest is uninteresting. my $win = Gtk2::Window->new; $win->set_title (_d('프로야구 순위 ')); $win->set_border_width (6); $win->signal_connect (delete_event => sub { #종료를 눌렀을 때 다이알로그 표시 my ($button, $url) = @_; my $message = Gtk2::MessageDialog->new ($button->get_toplevel, [], 'info', 'ok', _d("Perl_Mania\n\n"). _d("한국 프로야구 순위 출력\n"). _d("http://www.koreabaseball.com 를 참고\n"). _d("\n"). "-by H0ney" ); $message->run; $message->destroy; Gtk2->main_quit }); $win->add ($slist); $win->show_all; Gtk2->main;


원문의 코드가 짤리기 때문에... 링크 : http://codepad.org/kZj8bjXn



롯데가 결국 3위로  정규시즌을 마감했다. 조금만 더 힘을내면 좋았을껄.. 하는 아쉬움이 크다.

이번에는 한국시리즈 가야지~ 롯데 아자아자!



이건.. 뭐... 알림창 한번 사용해 보고 싶었다...라고 생각해 주시길;;

별 의미는 없지만.. 그래도 이뻐서~

누구나 이런거 만들잖아욧!  >.<




덤으로... 콘솔용 EXE 파일도 배포(?)

인자값으로 도움말이나 투수 & 타자 & 모두 를 넣어 보시길..





낙타 아이콘 이쁘다는...
신고
Trackback 0 Comment 2
2008.10.07 03:50

N번째로 발생하는 매치 찾기.


perl 쿡북에 있는 예제중 뼈가대고 살이되는 것들을 골라내어 정리해보았다.


1. 정규표현식을 사용하여 통해서 3번째 값을 찾는 코드이다.

if문을 적절하게 사용하였고 /g 변경자를 사용하여 전체 매치를 시켜 3번째 값을 찾아냈다.

1
2
3
4
5
6
7
8
9
use strict;
$_ = "one fish two fish red fish blue fish";
my $WANT = 3;
my $count = 0;
while(/(\w+)\s+fish\b/gi){
	if(++$count ==$WANT){
		print "The Third fish is a $1 one.";
	}
}


1
The Third fish is a red one.


2. 일치한 문자중  짝수번째 fish를 찾아낸다.

grep은 매치하는 요소를 추출하여 배열에 저장한다.
@foo = grep(!/^#/, @bar);    # weed out comments
 @foo = grep {!/^#/} @bar;    # weed out comments

count 변수가 1씩 증가하면서 짝수일 경우의 값을 저장한다.

1
2
3
$_ = "one fish two fish red fish blue fish";
@evens = grep { $count++ %2 == 1} /(\w+)\s+fish\b/gi;
print "Even numbered fish are ( @evens )\n";


1
Even numbered fish are ( two blue )


3. 치환 작업 

정규표현식에 if문도 있고 ... 정말 신기한 코드가 아닌가!!

4번째 매치되는 fish 앞의 문자열을 sushi로 치환하는 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$_ = "one fish two fish red fish blue fish";
my $count = 0;
s{
	\b
	(\w+)
	(
	\s+fish\b
	)
}{
	if(++$count==4){
	"sushi". $2;
	} else {
	$1 . $2;
	}
}gex;
print 


4. 마지막 일치하는 값을 구하는 코드

매치된 값을 리스트로 만들고 거기에 [-1]의 값을 저장하는 발상 자체가 흥미롭다.

1
2
3
$_ = "one fish two fish red fish blue fish";
$last = (/\b(\w+)\s+fish\b/gi)[-1];
print "Last fish is $last\n";

Output:

1
Last fish is blue


마지막 값을 구하는 또 하나의 코드

/g를 사용하지 않고 마지막 매치를 구하고자 할 때

?! 는 발견되어서는 안되는 코드 Negative lookahead assertion 을 이용한다.

1
2
3
4
5
6
7
8
9
10
$_ = "one fish two fish red fish blue fish";
if(m{
		\b (\w+) \s+ fish \b
		(?! .* \b fish \b)
	}six)
{
	print "Last fish is $1. \n";
}else{
	print "Failed!\n";
}


Output:

1
Last fish is blue. 

신고
Trackback 0 Comment 1