Grep和Python

Dav*_*vid 67 python regex grep

我需要一种通过Unix命令行中的正则表达式使用grep搜索文件的方法.例如,当我输入命令行时:

python pythonfile.py 'RE' 'file-to-be-searched'
Run Code Online (Sandbox Code Playgroud)

我需要'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'
Run Code Online (Sandbox Code Playgroud)

但是当我输入一个不存在的单词时,no matches found不会打印

Nic*_*cue 75

自然的问题是为什么不只是使用grep ?! 但假设你不能......

import re
import sys

file = open(sys.argv[2], "r")

for line in file:
     if re.search(sys.argv[1], line):
         print line,
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • search而不是match在字符串中找到任何地方
  • 删除回车,后的逗号()print行(将有一个)
  • argv 包含python文件名,因此变量需要从1开始

这不处理多个参数(如grep)或扩展通配符(如Unix shell).如果您想要此功能,可以使用以下方法获取它:

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,
Run Code Online (Sandbox Code Playgroud)

  • 你应该在使用循环之前编译你的正则表达式. (7认同)
  • 这有两个投票,我不知道为什么.任何投票的人都想发表评论?我知道你可以添加正则表达式编译等,但我认为这会减损答案的清晰度.我不认为有什么不正确的,我运行代码,不像其他一些答案 (4认同)
  • "你应该在使用循环之前编译你的正则表达式.",不,Python会自行编译和缓存它,这是一个常见的神话,出于可读性原因这是一件好事,尽管如此. (4认同)
  • 自然问题的合理答案是"因为代码是一个更大的Python脚本的一部分,并且谁想在这种情况下调用grep?" 简而言之,我很高兴这个问题在这里,因为我正在用一个Python脚本替换一个bash脚本,希望在系统上更容易. (4认同)
  • 对我来说,这个问题的答案是“我们希望在 Windows 机器上的生产日志中进行 grep,但他们没有适当的 grep,只有一个无用的 baregrep 工具,但我们所有的客户端都将安装 Python,因为我们的系统使用它”。 (3认同)

Gia*_*lli 13

简洁和内存效率:

#!/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)))
Run Code Online (Sandbox Code Playgroud)

它像egrep一样工作(没有太多的错误处理),例如:

cat input-file | grep.py "RE"
Run Code Online (Sandbox Code Playgroud)

以下是单行:

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"
Run Code Online (Sandbox Code Playgroud)


mik*_*iku 6

改编自python中grep.

接受文件名列表[2:],不进行异常处理:

#!/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
Run Code Online (Sandbox Code Playgroud)

sys.argv[1]resp sys.argv[2:]工作,如果你把它作为独立的可执行文件运行,意思是

chmod +x

第一

  • @OscarRyz看到[Nick Fortescue的最佳答案](http://stackoverflow.com/a/1921932/327074):"`search`而不是`match`来找到字符串中的任何地方" (2认同)

jld*_*ont 5

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