【问题标题】:Search Multiple Strings (from File) in a file and print the line在文件中搜索多个字符串(来自文件)并打印该行
【发布时间】:2016-10-20 12:41:15
【问题描述】:

再次为这里的菜鸟道歉:尝试下面的代码来搜索从关键字中读取的多个字符串并在 f 中搜索并打印该行。 如果我只有一个关键字,但如果我有多个关键字,它就可以工作。

keywords = input("Please Enter keywords path as c:/example/ \n :")
keys = open((keywords), "r").readline()
with open("c:/saad/saad.txt") as f:
    for line in f:
        if (keys) in line:
            print(line)

【问题讨论】:

  • 您能提供输入和预期输出吗?
  • 这个关键字文件的格式是什么?一行中的一堆单词,用空格隔开?
  • keywords ("aa","bb") : file contains line like (aa is good , bb is very good , cc is not good): 预期输出为 : aa is good bb is very good

标签: python file search keyword


【解决方案1】:

查找关键字的挑战之一是定义关键字的含义以及应如何解析文件的内容以找到完整的关键字集。如果 "aa" 是关键字,它应该匹配 "aaa" 还是匹配 ""aa()"?关键字中可以有数字吗?

一个简单的解决方案是说关键字只是字母并且应该完全匹配连续的字母字符串,忽略大小写。此外,匹配应该逐行考虑,而不是逐句考虑。我们可以使用正则表达式来查找字母序列和集合来检查包含,如下所示:

keys.txt

aa bb 

test.txt

aa is good
AA is good
bb is good
cc is not good
aaa is not good

test.py

import re

keyfile = "keys.txt"
testfile = "test.txt"

keys = set(key.lower() for key in 
    re.findall(r'\w+', open(keyfile , "r").readline()))

with open(testfile) as f:
    for line in f:
        words = set(word.lower() for word in re.findall(r'\w+', line))
        if keys & words:
            print(line, end='')

结果:

aa is good
AA is good
bb is good

为匹配的含义添加更多规则,它会变得更加复杂。

编辑

假设您每行有一个关键字,并且您只想要一个子字符串匹配(即“aa”匹配“aaa”)而不是关键字搜索,您可以这样做

keyfile = "keys.txt"
testfile = "test.txt"

keys = [key for key in (line.strip() for line in open(keyfile)) if key]

with open(testfile) as f:
    for line in f:
        for key in keys:
            if key in line:
                print(line, end='')
                break

但我只是在猜测你的标准是什么。

【讨论】:

  • 我试过这个,但有几个问题; 1.由于某种原因,如果每行输入一个关键字,例如 aa bb cc,它不会搜索任何内容,如果我将关键字放在一行中,那么它只返回 bb 2。其次,如果我想返回 'aaa' 以及如果 'aa' 关键字怎么办被搜索
  • 那么re.findall() 函数需要一个不同的[正则表达式]。
  • 输入文件可以有多种格式,不可能涵盖所有的可能性。您可以像我在回答中所做的那样在您的问题中放入样本。对于每行一个键,您可以逐行读取文件,去掉空格,然后过滤空,如keys = [key for key in (line.strip() for line in open(keyfile)) if key]。要匹配"aaa",您需要进行子字符串搜索而不是正则表达式。
  • 感谢@tdelany 终于成功了,如果你能打破这条线,只需再提出一个请求,我在解码它时遇到了一点问题 keys = [key for key in (line.strip() for line in open(keyfile)) if key]
  • 您可以使用[key.strip() for key in open(keyfile)] 读取和删除每一行。但是如果文件有一个空行,则其中一个键将是一个空字符串。因此,您可以使用 [key.strip() for key in open(keyfile) if key.strip()] 检查每个键,或者您可以添加一个生成器 (key.strip() for key in open(keyfile)) 以只执行一次剥离。
【解决方案2】:
keywords = input("Please Enter keywords path as c:/example/ \n :")
keys = open((keywords), "r").readline()
keys = keys.split(',')  # separates key strings
with open("c:/saad/saad.txt") as f:
    for line in f:
        for key in keys:
            if key.strip() in line:
                print(line)

您正在以一个字符串的形式读取该行。您需要列出每个逗号分隔的字符串。然后测试每一行的每个键(删除键周围的空格)

这是假设您的关键字文件是这样的:aa 好,bb 好,垃圾邮件,鸡蛋

【讨论】:

    【解决方案3】:
    #The Easiest one...
    def strsearch():
    
      fopen = open('logfile.txt',mode='r+')
    
      fread = fopen.readlines()
    
      x = 'Product Name'
    
      y = 'Problem Description'
    
      z = 'Resolution Summary'
    
      for line in fread:
    
          #print(line)
    
           if x in line:
    
               print(line)
    
           if y in line:
    
               print(line)
    
           if z in line:
    
               print(line)
    

    strsearch()

    【讨论】:

      猜你喜欢
      • 2017-11-17
      • 2014-09-06
      • 2015-02-13
      • 2015-11-12
      • 1970-01-01
      • 2015-12-21
      • 2015-09-11
      • 1970-01-01
      • 2017-05-23
      相关资源
      最近更新 更多