我想在python函数中实现unix命令“grep-r”。我知道commands.getstatusoutput(),但现在我不想使用它。我想到了这个:
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) ]
但这不起作用,即使在前一个函数起作用的地方,它也不会给我任何匹配。什么改变了?我可以把它分成一堆嵌套循环,但我更感兴趣的是简洁而不是可读性。
您可能希望
search()
而不是match()
来捕获行中间的匹配项,如http://docs.python.org/library/re.html#matching-vs-searching中所述而且,代码的结构和意图是相当隐蔽的。我把它化脓了。
re.match只检查字符串的开头。
使用重新搜索()
来自the docs:
将所有这些代码放入一个名为pygrep和chmod+x pygrep的文件中:
相关问题 更多 >
编程相关推荐