9장 연습 문제 6번, 7번

명령줄에서 찾고자 하는 단어와 검색할 파일을 입력하면 단어를 찾는 프로그램을 작성하는 문제이다.

출력을 하면 각 라인과 파일 이름, 라인 번호까지 출력 하도록 해야 한다.
# -*- coding: cp949 -*-
import sys
import glob

word = sys.argv[1]

for k in glob.glob(sys.argv[2]) :
    f = open(k)
    num = 1
    for line in f :
        if word in line.split() :
            print '파일 :' + `k` + ', ' + `num` + '번째 라인'
            print line
        num += 1
위와 같이 코딩을 해보았다. 검색할 파일이 여러개가 될 수 있기 때문에 for 문으로 각 파일을 열어서 단어를 찾도록 했다. 그리고 단어는 라인을 공백 분리 시켜서 그 리스트에 단어가 있는지 여부를 확인 했다.


7번 문제는 단어에 정규식을 쓸 수 있도록 하는 문제이다. 정규식에 관한 내용은 앞의 문제에서도 많이 나왔었다.
# -*- coding: cp949 -*-
import sys, glob, re

pattern = '\\s' + sys.argv[1] + '\\s'

for k in glob.glob(sys.argv[2]) :
    f = open(k)
    num = 1
    for line in f :
        if re.search(pattern, line) :
            print '파일 :' + `k` + ', ' + `num` + '번째 라인'
            print line
        num += 1
위 코딩에서 라인에 있는 단어를 찾는데, 이때 패턴 좌우에 공백과 매치되는 \\s 를 넣었다.

\\s 를 넣지 않으면 일치하는 단어를 찾는 것이 아니라 문자의 조합을 찾기 때문에 원하는 결과가 나오지 않는다.
(예를 들면, 이.* 이라고 정규식을 입력하면 '이름들', '이름' 과 같은 문자 뿐만 아니라 '파이썬' 이라는 단어까지 매치가 된다)

댓글 없음:

댓글 쓰기