2011. 11. 20. 16:42

[ 반복 메타 문자 ]

[메타 문자]

[의미]

*

0회 이상 반복

+

1회 이상 반복

?

0회 or 1회

{m}

m회 반복

{m, n}

m회부터 n회까지 반복

 

[ 매칭 메타 문자 ]

[메타 문자]

[의미]

.

줄바꿈 문자를 제외한 모든 문자와 매치됨

^

문자열의 시작과 매치됨

$

문자열의 마지막과 매치됨

[ ]

문자 집합 중 한 문자를 의미

|

또는(or)를 의미

{ }

정규식을 그룹으로 묶음

 

[ 이스케이프 기호 ]

[종류]

[설명]

\\

역슬래쉬 문자 자체

\d

모든 숫자와 매치됨 [0-9]

\D

숫자가 아닌 문자와 매치됨 [^0-9]

\s

화이트 스페이스 문자와 매치됨 [ \t\n\r\f\v]

\S

화이트 스페이스가 아닌 것과 매치됨 [^ \t\n\r\f\v]

\w

숫자 또는 문자와 매치됨 [a-zA-Z0-9_]

\W

숫자 또는 문자가 아닌 것과 매치됨 [^a-zA-Z0-9_]

\b

단어의 경계를 나타냄. 단어는 영문자 혹은 숫자의 연속 문자열

\B

단어의 경계가 아님을 나타냄

\A

문자열의 처음에만 일치

\Z

문자열의 끝에만 일치

 

[ 최소 매칭을 위한 정규식 ]

[기회]

[의미]

*?

*와 같으나 문자열을 취소로 매치함

+?

+와 같으나 문자열을 취소로 매치함

??

?와 같으나 문자열을 최소로 매치함

{m,n}?

{m,n}과 같으나 문자열을 최소로 매치함

 

[ 정규 표현식에서 사용 가능한 플래그 ]

[플래그]

[내용]

I, IGNORECATE

대, 소문자를 구별하지 않는다

L, LOCATE

\w, \W, \b, \B를 현재의 로케일에 영향을 받게 한다

M, MULTILINE

^가 문자열의 맨 처음, 각 라인의 맨 처음과 매치 된다

$는 문자열의 맨 끝, 각 라인의 맨 끝과 매치

S, DOTALL

.을 줄바꾸기 문자도 포함하여 매치하게 한다

U, UNICODE

\w, \W, \b, \B가 유니코드 문자 특성에 의존하게 한다

X, VERBOSE

정규식 안의 공백은 무시된다

 

[ re모듈의 주요 메소드 ]

[메소드]

[설명]

compile(pattern[, flags])

pattern을 컴파일하여 정규식 객체를 반환

match(pattern, string[,flags])

string의 시작부분부터 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

search(pattern, string[,flags])

string의 전체에 대해서 pattern이 존재하는지 검사하여

MatchObject 인스턴스를 반환

split(pattern, string[, maxplit=0])

pattern을 구분자로 string을 분리하여 리스트로 반환

findall(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 리스트로 반환

finditer(pattern, string[, flags])

string에서 pattern을 만족하는 문자열을 반복자로 반환

sub(pattern, repl, string[, count=0])

string에서 pattern과 일치하는 부분에 대하여

repl로 교체하여 결과 문자열을 반환

subn(pattern, repl, string[, count=0])

sub와 동일하나, 결과로(결과문자열, 매칭횟수)를

튜플로 반환

escape(string)

영문자 숫자가 아닌 문자들을 백슬래쉬 처리해서 리턴.

(임의의 문자열을 정규식 패턴으로 사용할 경우 유용)

 

[ Match 객체 ]

Match객체는 match(), search()의 수행 결과로 생성되며, 검색된 결과를 효율적으로 처리할 수 있는 기능 제공.

◎ Match객체가 지원하는 메소드와 속성

[메소드]

[속성]

group([group1, ...])

입력받은 인덱스에 해당하는 매칭된 문자열 결과의 부분 집합을 반환합니다.

인덱스가 '0'이거나 입력되지 않은 경우 전체 매칭 문자열을 반환합니다.

groups()

매칭된 결과를 튜플 형태로 반환

groupdict()

이름이 붙여진 매칭 결과를 사전 형태로 반환

start([group])

매칭된 결과 문자열의 시작 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 시작 인덱스를 반환)

end([group])

매칭된 결과 문자열의 종료 인덱스를 반환. (인자로 부분 집합의 번호나

명시된 이름이 전달된 경우, 그에 해당하는 종료 인덱스를 반환)

pos

원본 문자열에서 검색을 시작하는 위치입니다.

endpos

원본 문자열에서 검색을 종료하는 위치입니다.

lastindex

매칭된 결과 집합에서 마지막 인덱스 번호를 반환. (일치된 결과가 없는 경우

에는 None을 반환)

lastgroup

매칭된 결과 집합에서 마지막으로 일치한 이름을 반환. (정규식의 매칭 조건에

이름이 지정되지 않았거나 일치된 결과가 없는 경우 None 반환)

string

매칭의 대상이 되는 원본 문자열입니다.

 

 

[ 예제 ] - re 모듈 함수

▶ re.match()와 re.search()의 차이

re.match()의 경우 대상 문자열의 시작부터 검색을 하지만,

re.search()함수는 대상 문자열 전체에 대해서 검색을 수행한다.

예) 아래와 같이 검색의 대상이 되는 문자열에 공백이 있는 경우나 또는

검색 키워드와 일치하는 문자열이 대상 문자열의 중간 이후에 존재하는 경우

re.match()함수는 검색을 못함.

 

▶ re.split() - 대상 문자열을 입력된 패턴을 구분자로 하여 분리

 

▶ re.findall() - 검색 문자열에서 패턴과 매칭되는 모든 경우를 찾아 리스트로 반환

 

▶ re.sub() - 패턴과 일치하는 문자열 변경

또한 변경할 문자열에 대해서 매칭된 문자열을 사용할 수도 있다.

 

 

[ 예제 ] - 정규 표현식 객체

▶ 동일한 패턴을 연속적으로 검색하는 경우, 정규식을 컴파일하여 정규표현식 객체를 생성.

 

▶ re.IGNORECASE 플래그로 대소문자 구분하지 않고 매칭 작업 수행

 

▶ re.MULTILINE 플래그를 설정하여 빈 라인을 제외하고 라인별로 분리

 

 

[ 예제 ] - Match 객체

▶ 일반적인 형식의 전화번호를 인삭하여 Match 객체가 지원하는 메소드 분석.

 

▶ 정규식 작성시 '(?<이름>..)' 형식으로 매칭 결과에 대해 이름을 부여하고,

groupdict() 메서드를 이용하여 사전 형태로 이름과 검색된 문자쌍을 얻음.

 

 

    

로우 문자열 표기법 (Raw string notation)

이스케이프 문자열을 표현하기 위하여 '\'(백슬래쉬)문자를 사용하기 때문에, 문자 '\'를 정규표현식

으로 표현하기 위해서는 '\\\\'로, 일반 문자열에선느 '\\'로 표현해야 합니다. 그래서 '\apple'이란

문자열을 검색하기 위해서는 아래와 같이 매우 복잡한 형식으로 표현해야 합니다.

 

 

로우 문자열 표기법은 문자열 앞에 'r'을 더한 것으로, \(백슬래쉬) 문자를 이스케이프 문자열로 처리

하지 않고 일반 문자와 동일하게 처리합니다. 이렇게 함으로써 정규표현식 및 문자열에서 '\'를 간단

하게 표현할 수 있습니다. 일반적으로 정규표현식에 사용되는 문자열에서는 이러한 편리함 때문에

많이 사용합니다.

 

 

Posted by devanix
2011. 7. 1. 23:22

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/disproportional.html

♧ 타이틀은 'call him', 'phone that evil' 이란 힌트와 함께 전화기 그림이 보인다.

즉, 악마에게 전화를 걸어야 하는데 그 악마가 누구인지 어떻게 호출해야 될지 모른다.

   

▷ 그림의 숫자'5'에는 링크가 걸려 있는데 클릭해 들어가 보면 XML형식의 코드가 보인다.

   

▷ 이는 XML-RPC Fault 형식과 유사한데 XML-RPC란,

인코딩 형식은 XML을 채택하고, HTTP를 통한 간단하고 이식성 높은 원격 프로시저 호출 방법을 제공하는

RPC 프로토콜의 일종이다.

   

   

▷ 파이썬 2.2부터 XML-RPC가 표준 모듈(xmlrpclib)로 포함되어 있으므로 따로 설치할 필요는 없다.

▷ 주요 함수는 다음과 같다.

♧ 주요 함수

ServerProxy.system.listMethods

- 서버가 어떠한 프로시저를 제공하는지 문자열 이름들을 리스트 형태로 출력.
ServerProxy.system.methodSignature(name)

- 프로시저가 어떻게 호출되는지 서명(인수 전달 목록)의 리스트를 돌려준다.
ServerProxy.system.methodHelp(name)

- 프로시저를 설명하는 문서 문자열을 가져다 준다.

   

▷ 위의 주요 함수를 통하여 해당 서버(phonebook)의 프로시저에 대한 정보를 출력해보자.

#encoding=utf8
from pprint import pprint
import xmlrpclib

# ① 해당 XML-RPC를 지원하는 phonebook 서버에 접속.
url = 'http://www.pythonchallenge.com/pc/phonebook.php'
phonebook = xmlrpclib.Server(url)

# ② 서버가 어떠한 API 제공하는지 리스트 형태로 출력.
pprint (phonebook.system.listMethods())

# ③ 'phone'에 대한 도움말 정보 얻기.
print phonebook.system.methodHelp("phone")

# ④ 'phone'에 대한 인수 목록 알아내기.
print phonebook.system.methodSignature('phone')

   

[ 출력 결과 ]

['phone',

'system.listMethods',

'system.methodHelp',

'system.methodSignature',

'system.multicall',

'system.getCapabilities']

Returns the phone of a person

[['string', 'string']]

▷ 위의 마지막 methodSignature('phone')의 결과로 얻어진 [['string', 'string']] 에서

처음 'string'은 프로시저의 리턴형이고 나머지는 입력 인수의 형이다.

▷ 즉, phone은 특정 이름을 string형으로 받아 string형으로 리턴 해주는 프로시저다.

   

▷ 악마는 누구인가!

이제 악마에게 전화를 거는 방법을 알았으니 그 악마가 누구 인지만 알면 된다.

Level12에서의 기억을 상기 시켜보면 evil4.jpg 에는 빈 화면이 보이는데

이것을 편집기로 보면 'Bert is evil! go back!' 라는 메시지가 출력 되었다.

즉, Bert가 evil이다.

   

▷ Bert에게 전화를 걸어 보자. (※ 위 소스코드 마지막 줄에 추가)

# ⑤ Bert에게 전화 걸기.
print phonebook.phone('Bert')

   

[ 출력 결과 ]

555-ITALY

  

   

[ Solution ] - http://huge:file@www.pythonchallenge.com/pcc/return/italy.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 29. 04:46

[ Problem ] - http://huge:file@www.pythonchallenge.com/pc/return/evil.html

♧ 카드 패를 5장씩 돌리고 있습니다. (타이틀은 dealing evil)

♧ 소스를 보면 evil1.jpg 링크가 걸려 있습니다. (이번 문제에만 숫자가 붙어 있습니다)

♧ 해당 그림의 패를 돌리는 모습을 연상하여 숫자를 증가 시켜 보면('evil2.jpg', 'evil3.jpg')

다음과 같은 그림 힌트가 주어 집니다.

♧ evil2.jpg를 보면 'not jpg-_.gfx' 메시지가 보입니다.
evil2.jpg를 -> evil2.gfx로 변경해 보면 evil2.gfx 파일을 받을 수 있습니다.

(
※ 참고로 evil4.jpg에는 빈 화면이 보이는데 이것을 편집기로 보면 'Bert is evil! go back!'
라는 메시지가 보인다. 이것은 다음 문제에 관련 되어 있다.)

 

♧ 해당 타이틀과 그림의 힌트를 다시 상기시키며

다음과 같이 'evil2.gfx' 파일을 5개의 파일로 각각 한 Byte씩 나눠 저장 합니다.

# encoding=utf8
from PIL import Image
from cStringIO import StringIO

# ① 해당 gfx 파일을 오픈.
im_file = open("evil2.gfx", 'rb').read()

# ② 해당 gfx파일을 각각 한 Byte씩 5개의 파일로 나눠서 저장.
for i in range(5):
    priece = im_file[i::5]
    im = Image.open(StringIO(priece))
    f = open(("%d.%s" % (i, im.format)), 'wb')
    f.write(priece)
    f.close()

   

♧ 'evil2.gfx'를 5분할 한 결과 입니다.

   

♧ 해당 그림의 단어를 연결해 보면 'disproportionality'에서

'ity'빼면 'disproportional'이 됩니다.

   

[ Solution ] - http://huge:file@www.pythonchallenge.com/pcc/return/disproportional.html 
( 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 27. 01:04

[ Problem ] - http://www.pythonchallenge.com/pc/return/bull.html

♧ 소스를 보면 황소에 링크(sequence.txt)가 걸려 있다.

Sequence.txt 파일을 보면 'a = [1, 11, 21, 1211, 111221,' 라는 내용이 보인다.

♧ 이것은 '보고 말하기 수열(look and say sequence)'로 우리에겐 '개미수열'

프랑스 소설가 베르나르 베르베르의 소설 [개미]로 많이 알려졌다.

♧ 위의 그림과 같이 앞에서 부터 중복되는 숫자의 개수와 그의 수를 차례로 보고 말하는 수열이다.

(※ 자세한 내용은 다음 [참조 1] [참조 2] 페이지를 참고하자.)

♧ 즉, 위의 1로 시작하는 '개미수열'의 30번째 단계의 길이(len(a[30]) = ?)
맞추는 문제이다.

(※ 해당 솔루션 문서 참조)

import re

curr = '1'
for each in range(30):
    match = re.findall("(\d)(\\1*)", curr)
    curr = ''.join([str(len(k+y))+k for k,y in match])

print len(curr)

  

   

[ Solution ] - http://www.pythonchallenge.com/pcc/return/5808.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 23. 19:39

[ Problem ] - http://www.pythonchallenge.com/pc/return/good.html

♧ 그림을 보면 검은 점들이 많이 보인다.

♧ 소스를 보면 title은 connect the dots로 알 수 있듯이 점들을 연결시키는 문제이다.

♧ 주석에 first와 second은 좌표에 점들을 의미하는데

이것은 PIL의 ImageDraw Moduledraw.line(xy, options)를 이용하여 각 좌표의 점들을 연결 시킨다.

   

♧ 그럼 좌표를 연결시켜 그려 보자. 처리 순서는 다음과 같다.

from PIL import Image, ImageDraw
# encoding=utf8

# ① 소스에 있는 first와 second를 붙여 넣기 한다.
first = [146,399,163, ...[생략]...]
second = [156,141,165, ...[생략]...]

# ② 이미지 생성.
img = Image.new('RGB', (640,480))
draw = ImageDraw.Draw(img)

# ③ 첫번째 점들을 연결시키면 황소에 몸통 부분이 녹색 으로 보인다.
draw.line(first, 'green', 2)
# ④ 두번째 점들을 연결시키면 황소에 얼굴 부분이 붉은색 으로 보인다.
draw.line(second, 'red', 2)
# ⑤ 그림을 보여준다.
img.show()

(※ 해당 좌표는 길어서 생략, 소스에 있는 좌표를 붙여 넣기 하자.)

   

♧ 출력 화면

(※ 해당 그림에 뿔이 존재 하기에 젖소(cow)가 아니라 황소 (bull)를 나타낸다.)

   

[ Solution ] - http://www.pythonchallenge.com/pcc/return/bull.html

(※ 문제에 대한 다양한 해결법은 링크 참조.)

   

Posted by devanix
2011. 6. 21. 08:09

[ problem ] - http://www.pythonchallenge.com/pc/def/ocr.html

♧ 힌트를 보면 소스 페이지라는 단어가 눈에 띤다.

일단 소스 페이지를 보면 아래와 같은 희귀문자 들이 엉망으로 섞여 있는 것을 볼 수 있다.

이 속에서 알파벳을 찾는 문제이다.

 
( re — Regular expression operations 참조)

   

 

[ Solution ] - http://www.pythonchallenge.com/pcc/def/equality.html
(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 20. 20:48

[ problem ] - http://www.pythonchallenge.com/pc/def/map.html

그림과 같이 K->M, O->Q, E->G의 규칙성은 해당 문자가 2만큼 떨어져 있다.

그림의 보라색 글자가 무슨 암호화 같이 보이지만 해당 글자를 2씩 증가하면
아래와 같이 string.maketrans() 권장한다는 친절한 멘트와 힌트가 보인다. (단, y->a)

"i hope you didnt translate it by hand. thats what computers are for.
doing it in by hand is inefficient and that's why this text is so long.
using string.maketrans() is recommended.
now apply on the url."

♧ 현재 url의 "map.html"을 규칙성을 적용해 보면 "orc.jvon"이 된다.

(http://www.pythonchallenge.com/pc/def/ocr.jvon)

   

 

[ Solution ] - http://www.pythonchallenge.com/pcc/def/ocr.html
(※ 문제에 대한 다양한 해결법은 링크 참조.)

Posted by devanix
2011. 6. 20. 19:56

http://www.pythonchallenge.com/index.php

♧ Python 프로그래밍을 여러 수수께끼 문제를 통해 쉽고 재미있게 배울 수 있는 사이트.

   

[ 도전하기 ]

♧ 사이트 접속후 아래 "Click here to get challenged"를 클릭하면 도전 시작.

   

♧ 도전을 시작 하면 아래와 같은 문제 화면이 보인다.

※ 2의 38승을 구하는 문제이다.
URL 주소란에 그림과 같이 문제의 답을 적으면 다음 레벨로 넘어가게 된다.

   

[ 문제에 대한 다양한 해결책 보기 ]

위와 같이 URL을 pc->pcc로 고치면 다음 그림과 같이 문제에 대한 여러 해결법을 볼 수 있다.

   

[ Solution ] - http://pythonchallenge.com/pcc/def/map.html

Posted by devanix