我想在python函數中實現unix命令'grep -r'。我知道有關commands.getstatusoutput(),但現在我不想使用它。我想出了這個:grep -r python
def grep_r (str, dir):
files = [ o[0]+"/"+f for o in os.walk(dir) for f in o[2] if os.path.isfile(o[0]+"/"+f) ]
return [ l for f in files for l in open(f) if str in l ]
但這當然不使用正則表達式,它只是檢查是否「STR」是「L」的子字符串。所以我嘗試以下內容:
def grep_r (pattern, dir):
r = re.compile(pattern)
files = [ o[0]+"/"+f for o in os.walk(dir) for f in o[2] if os.path.isfile(o[0]+"/"+f) ]
return [ l for f in files for l in open(f) if r.match(l) ]
但這不起作用,即使前一個函數做了也不會給我任何匹配。什麼改變了?我可以把它分成一堆嵌套循環,但我更感興趣的是簡潔而不可讀。
是的,我的是幾乎沒有可讀的,自從我讀this article by Peter Norvig我一直把那些「我爲我的some_generator '在我的代碼語句... – aaronstacy 2009-12-07 22:24:16
哦,它的自然要使用強大的抽象!在列表推導出現之前,我曾經使用map()和reduce()的怪異多行構造 - 我真的很喜歡「做到這一切,而不是」的想法,而不是「好吧,下一個做...」確定下一個,然後......「但我知道我的同事無法解開它,這與計算機完全一樣。 – 2009-12-07 22:31:21
如果你喜歡拼寫糾正器,你應該學習haskell。集合上的函數映射是一個自然的http://github.com/timrobinson/spell-correct/blob/master/Correct.hs – 2009-12-07 22:34:50