2011-04-27 46 views
0

下面的代码片段需要一个字符串(userstring)并搜索给定目录中的所有.txt和.log文件以进行匹配。但是,我添加了两个其他变量(userStrHEX & userStrASCII),其中我将该字符串转换为十六进制,并将ascii转换为对这些字符串格式搜索所有.txt和.log文件。目前,这些变量没有被使用。我正在考虑将这些变量添加到列表中,也许可以使用while循环遍历代码的该部分,直至列表中的项目数量。此外,我想我需要将列表中的每个项目分配给一个静态变量,每次迭代循环时......我卡住了!我将不胜感激。谢谢!我想了解如何搜索三种不同类型的字符串

def do_search(self, line): 
      print " Directory to be searched: c:\Python27 " 
      directory = os.path.join("c:\\","Python27") 
      userstring = raw_input("Enter a string name to search: ") 
      userStrHEX = userstring.encode('hex') 
      userStrASCII = ' '.join(str(ord(char)) for char in userstring) 
      for root,dirname, files in os.walk(directory): 
      for file in files: 
       if file.endswith(".log") or file.endswith(".txt"): 
        f=open(os.path.join(root, file)) 
        for line in f.readlines(): 
         if userstring in line: 
          print "file: " + os.path.join(root,file)   
          break 
        else: 
         print "String NOT Found!" 
         break 
        f.close() 

回答

3

最好的方法是创建一个匹配所有三个字符串的正则表达式。看看re模块的文档。简而言之:

regex = re.compile("(%s|%s|%s)" % (re.escape(userstring), re.escape(userStrHEX), re.escape(userStrASCII)) 

,而不是“一致userstring”然后,检查regex.search(线)

+0

我当时一看,但还是不太清楚再将如何解决我的问题。 – suffa 2011-04-27 12:07:03

+0

最简单的方法是,您可以将正则表达式视为检查字符串是否在另一个字符串中的方式,就像您的“用户字符串在线”检查一样。使用re的等价物是“re.search(userstring,line)”。但是正则表达式可以做比检查文字字符串更多的功能。像+,。,\ w等字符串中的特殊字符可让您检查“一个或多个”,“任何字符”,“任何单词字符”。您也可以创建一个匹配“a”或“b”的正则表达式。请尝试以下操作: – froody 2011-04-27 16:06:22

+0

呃,不能在此放置换行符。从互动模式尝试的东西:re.search(“a”,“foo”); re.search(“a”,“bar”); re.search(“o | a”,“foo”); re.search(“o | a”,“bar”)。 – froody 2011-04-27 16:07:48