2010.03.09 14:16 WarGame




소스를 보니 2번처럼 잔뜩 문자들이 있군요

2번과는 다른 조건이 주어졌지만 특정 조건을 만족하는 문자들을

찾는다는 목표는 동일합니다

조건이 상당히 까다로워지긴 했지만요

음..

예를 들면 AAAbAAA 이런식이라면 b가 바로

우리가 찾는 문자가 되겠죠

무식하게 일일히 찾는 방법도 있겠습니다

효율이 안좋긴 하지만 매우 직관적이죠




이러고 끝내기는

편한 방법을 두고 돌아가는것 같아서 다른 방법을 모색해봤습니다

분명 어딘가 힌트가 있을 것이라고 생각했는데

마침 페이지의 제목이 re 라는게 눈에 띕니다

혹시나 해서 python re 라고 구글링을 해보니

제대로 짚은거 같군요

Regular Expression  정규표현식의 준말이군요

re 라는 모듈이 있고 그 함수 중에 우리가 원하는 함수를

찾아야겠죠

제가 선택한 함수는 Findall 입니다

일단 이 함수를 사용하기 위해서는 Python 정규표현식을 알아야하는데

kukuta 님의 블로그에서 퍼왔습니다

http://kukuta.tistory.com/4 


반복 메타문자

문자

의미

*

0회 이상 반복

ca*t => ct, cat, caat, caaat, …

+

1회 이상 반복

ca+t => cat, caat, caaat

?

0회 혹은 1

ca?t => ct, cat

{m}

m회 반복

ca{2}t => caat

{m, n}

m회부터 n회까지 반복

ca{2,4}t => caat, caaat, caaaat



최소 매칭

기호

의미

*?

* 와 같으나 문자열을 최소로 매칭한다.

+?

+ 와 같으나 문자열을 최소로 매칭한다.

??

? 와 같으나 문자열을 최소로 매칭한다.

{m, n}

{m,n}와 같으나 문자열을 최소로 매칭한다.



매칭
매타 문자

메타 문자

의미

.

개행 문자를 제외한 모든 문자와 매칭 된다. re.DOTALL 플래그가 셋팅되어져 있다면 줄바꿈 문자 까지도 매칭 대상에 포함된다.

^

문자열의 시작과 매칭된다.

re.MULTILINE 모드에서는 각 라인의 시작과 매칭된다.

[] 메타기호 안에서는 반대의 문자열을 취한다

) [^a-zA-Z0-9] 모든 알파벳과 숫자를 제외한 것 들과 매칭된다

$

문자열의 마지막 또는 문자열 끝의 개행 문자와 매칭되며, MULTILINE 모드 역시 개행 문자의 앞까지 매칭된다. ‘foo$’가 오직 foo 매칭되는 것과는 반대로 foo foo foobar 다 매칭된다. 흥미로운 것은 foo.$ ‘foo1\nfoo2\n’에서 찾는다면 foo2는 매치가 되지만 foo1MULTILINE 모드에서만 매칭이 된다는 것이다.

[]

문자 집합을 나타낸다. [abc]‘a’, ‘b’, ‘c’ 문자 중 하나를 의미한다. [a-c]와 같이 나타낼 수도 있다.

|

a|b 는 해당 문자가 ‘a’이거나 ‘b’라는 뜻이다.

()

규식을 그룹으로 묶는다. 이것은 match 또는 search를 통해 리턴되는 Match 오브젝트의 group를 호출할 때 사용된다.




이스케이프
문자

문자

설 명

\\

역슬래쉬 문자

\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

\b의 반대로 단어의 경계가 아님을 나타낸다.





여기서 우리가 쓸 표현식은

[] 와 {} 정도가 되겠군요

정규식을 완성시키면


[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]
 
가 되겠고  우리가 원하는 부분은 저 소문자 부분이니 괄호를 씌워주면 되겠죠
 
거기에 결과가 한글자가 아닐테니 Join 으로 통합 시켜주면 완성입니다
 
또한 정규식 부분은 부정을 의미하는 ^을 첨가해서
 
[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]로 나타낼 수도 있겠습니다
 
소스 코드 보면 정말 너무 간단하죠
 
파이썬 참 대단한 언어라고 생각합니다 :D
 

'WarGame' 카테고리의 다른 글

[Python Challenge] level5 풀이  (2) 2010.03.11
[Python Challenge] level4 풀이  (0) 2010.03.10
[Python Challenge] level3 풀이  (0) 2010.03.09
[Python Challenge] level2 풀이  (0) 2010.03.05
[Python Challenge] level1 풀이  (0) 2010.03.05
[ Padocon 2010 ] Crackme 100 Breakme 풀이  (0) 2010.02.28
Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday23
Today32
Total330,241

달력

 « |  » 2019.7
  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      

최근에 받은 트랙백

글 보관함


. .