± в регулярном выражении в питоне - PullRequest
0 голосов
/ 01 июня 2018

Я делаю регулярное выражение с python 2.7.

В моем документе есть строка "INL±1LSB", и я пытаюсь найти эту строку и вывести 1LSB.

Я пробовал этокоманда:

strings = re.findall(r'INL(?:\xb1)(1LSB)', f.read())
print (strings)

но не может найти.(результат печати []).

, но когда я изменяю строку в документе на "±1LSB" и использую такие команды, как:

strings = re.findall(r'(?:\xb1)(1LSB)', f.read())
print (strings)

, вывод будет ['1LSB']

Мне кажется, проблема в том, что он не может найти ни одного символа до ±.

Что мне нужно сделать, чтобы исправить это?

1 Ответ

0 голосов
/ 05 июня 2018

В вашем документе есть строка 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 был спроектирован так, чтобы поощрять вас декодировать все, когда это возможно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...