Могу ли я напечатать, какой формат строки был найден из нескольких строк, поиск Regex

1

В приведенном ниже коде я ищу строку, шестнадцатеричный и ascii.... Если строка сопоставлена, печатается файл, в котором была сопоставлена ​​строка. Есть ли способ напечатать, какой тип строки был сопоставлен (hex, ascii или string)? Кроме того, я хотел бы рассмотреть верхний и нижний регистр, а также цифры [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 ответа

2
Лучший ответ
result = regex.search(line)
print result.group()

В regex.search будет возвращен объект результата. То, что возвращается result.group(), является списком соответствующих строк, и в вашем случае это будет список с 1 элементом, совпадающей строкой HEX, ASCII или строкой.

  • 0
    Жюльен - когда вы говорите вызов группе (), что вы имеете в виду? Я все еще нахожусь в тупике на этом
  • 0
    result = regex.search(line) print result.group()
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

Глядя на ваше регулярное выражение (одно из трех возможных слов и никаких реальных функций регулярного выражения), я бы вообще не использовал regexp.

Вы можете легко добавить дополнительные функции:

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

Просто проверьте порядок своих условий, чтобы поймать правильный случай (т.е. если вы проверите регистр-регистр, нечувствительный к регистру, последний никогда не произойдет и т.д.)

  • 0
    Спасибо! Но ради знания, как бы я добавил нечувствительную к регистру функцию в регулярное выражение выше (например, re.IGNORECASE)?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню