在一个文件中查找缺少的条目

时间:2014-07-30 10:16:26

标签: regex

我有两个档案:

1st: Entries.txt

confirmation.resend
send
confirmation.showResendForm
login.header
login.loginBtn

第二名: Used_Entries.txt

confirmation.showResendForm = some value
login.header = some other value

我想找到第一个文件中的所有条目( Entries.txt ),这些条目尚未在第二个文件中作为一个值( Used_Entries.txt

在此示例中,我希望以下结果

confirmation.resend
send
login.loginBtn

结果confirmation.showResendFormlogin.header未显示,因为它们存在于 Used_Entries.txt

我该怎么做?我一直在玩正则表达式,但还没有能够解决它。 bash脚本或某事物将非常感谢!

3 个答案:

答案 0 :(得分:1)

你可以用正则表达式做到这一点。但是请准备好您的代码情绪,因为您无法同时将这两个文件与正则表达式匹配,而我们执行希望同时将这两个内容与正则表达式匹配。好吧,这意味着你必须至少对你的语言有一些了解,我希望你能连接两个文件中的内容,中间至少有一个新行。

此正则表达式解决方案希望您的字符串匹配为以下格式:

text (no equals sign)
text
text
...
key (no equals sign) ␣ (optional whitespace) = (literal equal) whatever (our regex will skip this part.)
key=whatever
key=whatever

我引起你的注意吗?是?请参阅以下正则表达式(使用大多数正则表达式引擎可访问的技术):

/(^[^=\n]+$)(?!(?s).*^\1\s*=)/m

受到a recent answer I saw from zx81的启发,您可以切换到中间的(?s)标记以突然切换到DOTALL模式,这样您就可以开始与.进行多行匹配在RegExp中间。使用这种技术和上面的设置语法,这是正则表达式的作用,如解释

  • (^[^=\n]+$)浏览所有text (no equals sign)元素。在捕获中强制执行等号或换行符。这意味着我们的正则表达式将每个text元素作为一行命中,并尝试将其恰当地匹配。
  • (?!打开一个负向前瞻组。断言此匹配将找到以下内容:
  • (?s).*任意数量的字符或新行 - 由于这是一个贪婪的匹配,会将我们的匹配器指针抛到字符串的最后,跳到文档的最后部分以便快速回溯并快速挖掘
  • ^\1\s*=捕获的密钥,在一些可选的空格后面跟一个等号,在它自己的行中。
  • )结束我们的小组。

View a Regex Demo

A regex demo with more test cases


我很蠢。我本可以这样说的:

/(^[^=\n]+$)(?!.*^\1\s*=)/sm

答案 1 :(得分:0)

    import re
    e=open("Entries.txt",'r')
    m=e.readlines()
    u=open("Used_Entries.txt",'r')
    s=u.read()
    y=re.sub(r"= .*","",s)
    for i in m:
        if i.strip() in [k.strip() for k in y.split("\n")] :
            pass
    else:
        print i.strip()

答案 2 :(得分:0)

我一直在努力解决这个问题,只是用scala中的一个小脚本解决了这个问题:

import scala.io.Source

object HelloWorld {
  def main(args: Array[String]) {

    val entries = (for(line <- Source.fromFile("Entries.txt").getLines()) yield {
      line
    }).toList

    val usedEntries = (for(line <- Source.fromFile("Used_Entries.txt").getLines()) yield {
      line.dropRight(line.length - line.indexOf(' '))
    }).toList

    println(entries)
    println(usedEntries)

    val missingEntries = (for {
      entry <- entries
      if !usedEntries.exists(_ == entry)
    } yield {
      entry
    }).toList

    println(missingEntries)

    println("Missing Entries: ")
    println()
    for {
      missingEntry <- missingEntries
    } yield {
      println(missingEntry)
    }

  }
}