IT’s Portfolio

[Python Challenge] Level 2 풀이 본문

Security Study/Wargame Explanation

[Python Challenge] Level 2 풀이

f1r3_r41n 2019. 11. 20. 19:07
728x90
반응형

http://pythonchallenge.com

 

The Python Challenge

What people have said about us: "These sorts of things are in my opinion the best way to learn a language.", brberg at Media Cloisters "It's the best web site of the year so far.", Andy Todd at halfcooked "Addictive way to learn the ins and outs of Python.

www.pythonchallenge.com

 

Python Challenge Level 2 풀이이다.

먼저 문제를 보자.

HINT

"recognize the characters. maybe they are in the book, but MAYBE they are in the page source."

=>

"등장인물들을 알아본다. 아마도 책에 있을 것 같은데, 페이지 소스에도 있을 수 있다."

 

페이지 소스를 봐보자.

페이지 소스 밑에 주석처리된 부분이 보인다.

find rare characters in the mess below : 아래 엉망진창인 글에서 희귀한 글자를 발견해라.

 

페이지 소스를 txt 파일로 긁어와 저 엉망진창인 글만 남기고 저장한다.

문자열을 거르는 방법은 2가지가 있다.

  • 입력값 검증
  • 정규표현식

* isalpha() 함수: 문자열이 영어 혹은 한글로 되어있으면 참 리턴, 아니면 거짓 리턴.

* isalnum() 함수: 문자열이 영어 혹은 숫자로 되어있으면 참 리턴, 아니면 거짓 리턴.

 

입력값 검증 스크립트를 먼저 짜보자.

text = open('ocr.txt', 'r')
data = text.read()

check = ""

for i in data:
    if i.isalpha():
        check = check+i

print(check)

open 함수로 ocr.txt를 열고 data에 text를 읽은 값을 저장한다.

for문으로 문자열을 반복해서 체크한다.

isalpha() 함수로 영어나 한글인 문자열을 찾고 리턴값이 참이라면 check에 i를 추가한다.

 

정규표현식 스크립트도 짜보자.

import re

text = open('ocr.txt', 'r')
data = text.read()

check = re.findall("[A-Za-z]", data)

check1 = ""

for i in range(0, len(check)):
    check1 += check[i]

print(check1)

정규표현식을 사용하기 위해서 re 모듈을 사용했다.

data에서 정규표현식 [A-Za-z] (A부터 Z, a부터 z)를 만족하는 값을 찾는다.

List값인 check를 for문으로 str 문자열로 만든다.

 

둘 다 똑같은 결과로 equality가 뜬다.

 

URL 정답값: equality

 

최신화

2020.10.20

'''
recognize the characters. maybe they are in the book,
but MAYBE they are in the page source.
'''

import re
from get_html_source import get_html

A = get_html('http://www.pythonchallenge.com/pc/def/ocr.html')

html = A.get_req().replace('\n', '')

m = re.findall('<!--(.+?)-->', html)

if m:
    with open('source.txt', 'wt') as f:
        f.write(m[1])

'''
m[0] = find rare characters in the mess below:
'''

with open('source.txt', 'rt') as f:
    below = f.read()
    characters = ''.join(re.findall('[a-zA-Z]', below))
    print(characters)
  • 웹 페이지 내용 파싱 및 파일 입출력 추가
  • for이 아닌 join 사용

 

Level 3으로 갈 수 있는 URL = http://www.pythonchallenge.com/pc/def/equality.html

728x90
반응형
Comments