我可以打印出在多字符串正则搜索中匹配的字符串格式吗?

1 投票
2 回答
705 浏览
提问于 2025-04-16 16:31

在下面的代码中,我正在查找字符串、十六进制和 ASCII 码。如果找到了匹配的字符串,就会打印出匹配的文件。有没有办法打印出匹配的字符串类型(十六进制、ASCII 码或普通字符串)呢?另外,我还想考虑大小写和数字 [0-9]+。我不确定是否可以把这些都放在同一个正则表达式里,还是说加另一行正则表达式会更好:

elif searchType =='2':
      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)
      regex = re.compile( "(%s|%s|%s)" % ( re.escape( userstring ), re.escape( userStrHEX ), re.escape( userStrASCII ) )
      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:
                   if regex.search(line):       
                      print "file: " + os.path.join(root,file)           
                      break
                else:
                   print "String NOT Found!"
                   break
                f.close()

2 个回答

4

这样怎么样?

for line in f.readlines():
    if userstring in line:
        print 'User input in file: ' + os.path.join(root, file)
        break
    elif userStrHEX in line:
        print 'HEX string in file: ' + os.path.join(root, file)
        break
    elif userStrASCII in line:
        print 'ASCII string in file: ' + os.path.join(root, file)
        break

看你的正则表达式(只是在找三个可能的单词,而且没有用到真正的正则表达式特性),我建议根本就不要用正则表达式。

你可以很简单地添加更多功能:

    elif userstring.lower() in line.lower():
        print 'User input (case-insensitive) in file: ' + os.path.join(root, file)
        break

只需要检查你条件的顺序,以确保能捕捉到正确的情况(比如,如果你先检查不区分大小写的情况,再检查区分大小写的情况,那么后者就永远不会发生,等等)。

2
result = regex.search(line)
print result.group()

regex.search 会返回一个结果对象。通过 result.group() 得到的是一个匹配字符串的列表。在你的情况下,这个列表里会有一个项目,就是匹配到的字符串,可能是 HEX、ASCII 或者普通字符串。

撰写回答