2013-03-21 3 views
0

Я иду через двоичный файл с регулярными выражениями, извлекающими данные, и у меня проблема с регулярным выражением, я не могу отследить.Python Regex не соответствует началу строки?

Это код У меня возникли проблемы с:

 z = 0 
     for char in string: 
      self.response.out.write('|%s' % char.encode('hex')) 
      z+=1 
      if z > 20: 
       self.response.out.write('<br>') 
       break 

     title = [] 
     string = re.sub('^\x72.([^\x7A]+)', lambda match: append_match(match, title), string, 1) 
     print_info('Title', title) 

def append_match(match, collection, replace = ''): 
    collection.append(match.group(1)) 
    return replace 

Это содержание первых 20 символов в строке, когда это работает:

| 72 | 0a | 50 | 79 | 72 | 65 | 20 | 54 | 72 | 6a | 19 | 54 | 72 | 6f | 6c | 6c | 62 | 6c

Он ничего не возвращает, за исключением случаев, когда я удаляю ^, в котором он возвращает «Тролль» (не кавычки), который равен 54726F6C6C. Он должен возвращать все до \ x7a, когда я его читаю.

Что здесь происходит?

+1

Ваш вход строка не начинается с '\ x72' характер - она ​​начинается с трубы. * edit Ничего ... Я думаю, что неверно истолковал ваш пример ввода. –

+0

Да, извините. Было проще рассказать каждому отдельному персонажу. – Joren

ответ

2

Проблема заключается в том, что по умолчанию точка \x0A (= новая линия) не будет сопоставляться точкой. Попробуйте добавить dotall flag к вашему шаблону, например:

re.sub('(?s)^\x72.([^\x7A]+).... 
+0

Ты мой герой. Добавление обработанной доты. Что вы добавили (? S)? – Joren

+0

Это тот же флаг, но добавлен встроенный в выражение. Обычно я предпочитаю этот синтаксис, поскольку он делает выражения ясными и самодостаточными. – georg

+0

А, ок. Благодарю. :) – Joren

Смежные вопросы