[python] Grep 및 Python
Unix 명령 줄에서 정규식을 통해 grep을 사용하여 파일을 검색하는 방법이 필요합니다. 예를 들어 명령 줄에 입력 할 때 :
python pythonfile.py 'RE' 'file-to-be-searched'
정규식 'RE'
을 파일에서 검색하고 일치하는 줄을 인쇄해야합니다.
내가 가진 코드는 다음과 같습니다.
import re
import sys
search_term = sys.argv[1]
f = sys.argv[2]
for line in open(f, 'r'):
if re.search(search_term, line):
print line,
if line == None:
print 'no matches found'
하지만 존재 no matches found
하지 않는 단어를 입력하면 인쇄되지 않습니다.
답변
당연한 질문은 왜 grep을 사용하지 않는 것입니까?! 하지만 당신이 할 수 없다고 가정하면 …
import re
import sys
file = open(sys.argv[2], "r")
for line in file:
if re.search(sys.argv[1], line):
print line,
참고할 사항 :
search
match
문자열의 아무 곳이나 찾는 대신- 캐리지 리턴
,
을print
제거한 후 쉼표 ( ) (줄에 하나가 있음) argv
파이썬 파일 이름을 포함하므로 변수는 1부터 시작해야합니다.
이것은 여러 인수를 처리하거나 (grep처럼) 와일드 카드를 확장하지 않습니다 (유닉스 셸처럼). 이 기능을 원하면 다음을 사용하여 얻을 수 있습니다.
import re
import sys
import glob
for arg in sys.argv[2:]:
for file in glob.iglob(arg):
for line in open(file, 'r'):
if re.search(sys.argv[1], line):
print line,
답변
간결하고 효율적인 메모리 :
#!/usr/bin/env python
# file: grep.py
import re, sys
map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))
egrep (너무 많은 오류 처리없이)처럼 작동합니다. 예 :
cat input-file | grep.py "RE"
그리고 여기에 한 줄짜리가 있습니다.
cat input-file | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE"
답변
답변
sys.argv
명령 줄 매개 변수를 가져 오는 데 사용- 사용
open()
,read()
파일을 조작 할 수 - Python re 모듈 을 사용하여 줄을 일치 시킵니다.
답변
답변
python-textops3 사용할 수 있습니다.
from textops import *
print('\n'.join(cat(f) | grep(search_term)))
python-textops3를 사용하면 파이프와 함께 유닉스와 유사한 명령을 사용할 수 있습니다.
답변
진짜 문제는 변수 라인에 항상 값이 있다는 것입니다. “일치하는 항목 없음”에 대한 테스트는 일치 항목이 있는지 여부이므로 “if line == None :”코드를 “else :”로 바꿔야합니다.