Grep和Python

2024-04-20 15:11:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我需要在文件中搜索正则表达式'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'

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


Tags: 文件no命令行importresearchifsys
3条回答

简洁高效:

#!/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(没有太多错误处理),例如:

cat input-file | grep.py "RE"

这是一行:

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"

自然的问题是为什么不直接使用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而不是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,

改编自grep in python

通过[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

sys.argv[1]respsys.argv[2:]有效,如果您将其作为独立的可执行文件运行,则意味着

chmod +x

第一

相关问题 更多 >