pythonで文字列の探索(grep.py)

grepコマンドのような振る舞いをするコードを書いた。動作は以下の通り

  • マッチした行を表示する際に行番号も一緒に表示する
  • 引数が1つの場合には標準入力をフィルタする
    • それ以上の場合は2つ目移行の引数をファイル名として扱ってフィルタする
    • その際には、stderrにファイル名を表示する。
% python grep.py
invalid argumentscat grep.py | python grep.py def
  3: def grep(itr, rx):
 10: def fgrep(file, rx):
 15: def iogrep(rx):

% python grep.py def nabe.py def.py fetch_page.py stop_watch.py wordhist.py grep.py tag_eraser.py get_cmdline_args.py
--file:nabe.py--
  2: def nabe(n):
--file:def.py--
  0: def f():
  3: def g():
--file:fetch_page.py--
--file:stop_watch.py--
  7:     def __init__(self,print_func, dt):
 11:     def run(self):
 13:         def timer_count(beg_time):
 22: def print_time(time):
--file:wordhist.py--
 10: def cached_open(url, cache='cache.html', convertEntities=None):
 16:         def write_file(data,name):
 26: def hist(s):
--file:grep.py--
  3: def grep(itr, rx):
 10: def fgrep(file, rx):
 15: def iogrep(rx):
--file:tag_eraser.py--
 10:   def __init__(self, soup):
 13:   def itr(self):

2>/dev/nullとしてやればファイル名は除去できる。

これで学んだこと

  • 正規表現にはreを使う。
    • 作成にはre.compile()。検索にはre.search()、re.match()
  • ファイル入出力
    • f=open() -> anything -> f.close()
  • 終了(exit)の方法
    • sys.exit()
    • Listのslicing*1

正しいか分からないけど思ったこと(あとで調べる)

__iter__を持っているオブジェクトはforループで回せる?

code

*1:lisp関数型言語でいうlistとは異なる