В вашем документе есть строка INL±1LSB
, закодированная в UTF-8, но вы пытаетесь сопоставить ту же строку, закодированную в Latin-1 (или некотором близком родственнике).Обычно проблемы с кодировкой гораздо более очевидны, чем эта, но вам удалось найти особенно коварную проблему, с которой легко запутаться.
Но сначала, решение: либо
- Измените свое регулярное выражение, чтобы использовать кодировку UTF-8 вместо кодировки Latin-1, чтобы оно совпадало с байтами поиска или
decode('utf8')
байтами и осуществляло их поиск с использованием Юникода, а не байтов регулярного выражения.
Объяснение:
В UTF-8 символ ±
кодируется как два байта, \xc2\xb1
.В Latin-1 он закодирован как один байт \xb1
.Который случается так же, как второй байт UTF-8.Это происходит только для небольшого блока символов в конце Latin-1, большинство из которых не так часто используются, поэтому большинство людей не узнают об этом, пока их не укусят.
Если вы будете искать в байтах \xb1LSB
, он будет совпадать, как и в случае с Latin-1, путем сопоставления половины символа.Но если вы поищете в них INL\xb1
, он потерпит неудачу, о чем вы и спрашивали.
Единственный способ, с помощью которого вы могли бы обнаружить проблему, - это если вы пошли декодировать все -маршрут в Unicode (что часто бывает; именно поэтому Python 3 был спроектирован так, чтобы поощрять вас декодировать все, когда это возможно).