如何获得正则表达式匹配的整行?

时间:2017-12-28 05:25:50

标签: python regex

因此,在“使用Python自动化无聊的东西”一书中,有这个家庭作业项目:

编写一个程序,打开文件夹中的所有.txt个文件,并搜索与用户提供的正则表达式匹配的任何行。结果应打印在屏幕上。

以下是我的代码。我有两个问题:

  1. 该程序是否有较短版本?
  2. 行正则表达式似乎有问题(我希望正则表达式匹配用户指定的正则表达式出现的整行),因为它没有在lineReg下显示任何结果。我尝试删除正则表达式的前导和尾随部分周围的括号。
  3. import os, re
    
    # Dir Location
    print('Enter a directory location: (in which txt files are located)')
    direct= input()
    os.chdir(direct)
    
    # Regexes
    print("Enter the text you'd like to search for: (or a regex)")
    givenReg= input()
    soloReg= re.compile(givenReg)
    lineReg= re.compile((r'^\n.*')+givenReg+(r'.*\n$'))
    txtFileReg= re.compile(r'.*\.txt')
    
    # Texts in Dir
    txtFiles= os.listdir(direct)
    
    # Finding line through Regex
    for i in range(len(txtFiles)):
        if txtFileReg.search(txtFiles[i]) != None:
            file= open(txtFiles[i])
            read= file.read()
    
            outcomeSolo= soloReg.findall(read)
            outcomeLine= lineReg.findall(read)
    
            print('In ' + txtFiles[i] + ', found these matches:')
            print(outcomeLine)
    
            print('In ' + txtFiles[i] + ', the lines for these matches were:')
            print(outcomeSolo)
    
            print('\n')
            file.close()
    

1 个答案:

答案 0 :(得分:1)

使程序缩短的一种方法是使其行为更像典型的命令行程序:将输入作为参数,而不是通过某种类型的对话。

另一种方法是使输出不那么健谈。看看grep如何适用于一个例子。

您还可以利用glob()等内容。

不是将整个文件读入内存,而是逐行遍历文件(这在这样的程序中有许多优点)。

最后,我不清楚为什么要将用户的正则表达式包装在自己的前导和尾随模式中:让用户完全控制正则表达式(至少,这就是我要做的)。

以下是这些要点的简短说明:

import sys, glob, re

dir_path = sys.argv[1]
rgx = re.compile(sys.argv[2])

for path in glob.glob(dir_path + '/*.txt'):
    with open(path) as fh:
        for line in fh:
            if rgx.search(line):
                msg = '{}:{}'.format(path, line)
                print(msg, end = '')