Grep和Python

我需要一种使用grep通过Unix命令行的正则expression式来search文件的方法。 例如,当我input命令行时:

python pythonfile.py 'RE' 'file-to-be-searched' 

我需要在文件中search正则expression式'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' 

但是,当我input一个不存在的单词时, 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而不是matchfindstring的任何地方
  • 逗号( , )后print删除回车(线将有一个)
  • argv包含python文件名,所以variables需要从1开始

这不处理多个参数(如grep)或扩展通配符(如Unix shell)。 如果你想要这个function,你可以使用下面的代码:

 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一样工作(没有太多的error handling),例如:

 cat file-to-be-searched | grep.py "RE" 

这里是一行:

 cat file-to-be-searched | python -c "import re,sys;map(sys.stdout.write,(l for l in sys.stdin if re.search(sys.argv[1],l)))" "RE" 

从Python中的grep改编而来。

通过[2:]接受文件名列表,不做任何exception处理:

 #!/usr/bin/env python import re, sys, os for f in filter(os.path.isfile, sys.argv[2:]): for line in open(f).readlines(): if re.match(sys.argv[1], line): print line 

sys.argv[1] resp sys.argv[2:]作品,如果你运行它作为一个独立的可执行文件,含义

chmod +x

第一

  1. 使用sys.argv获取命令行参数
  2. 使用open()read()来操作文件
  3. 使用Python重新模块来匹配行

你可能会对pyp感兴趣。 引用我的其他答案 :

“Pyed Piper”或pyp是一个类似于awk或sed的linux命令行文本处理工具,但它使用标准的pythonstring和列表方法以及演变而来的自定义函数,以在紧张的生产环境中生成快速结果。