Различные результаты для re.compile (). Совпадают на win10 и ubuntu с python3 - PullRequest
3 голосов
/ 23 сентября 2019

У меня странное поведение для win10 и ubuntu 18.04 с python 3.7.4 и следующим кодом

def tokenize(text, match=re.compile(b"([idel])|(\d+):|(-?\d+)").match):
    i = 0
    while i < len(text):
        m = match(text, i)
        s = m.group(m.lastindex)
        i = m.end()
        if m.lastindex == 2:
            yield "s"
            yield text[i:i + int(s)]
            i = i + int(s)
        else:
            yield s

Когда я открываю файл в режиме rb на win10 и ubuntu, я получаю разные результатыдля

        m = match(text, i)
        s = m.group(m.lastindex)

Для linux m.lastindex равен 1, а на win10 - 2.Дампы для re.compile равны, версии Python тоже.

В Windows объект re.Match имеет следующие значения

<re.Match object; span=(1, 3), match=b'8:'>

В Ubuntu:

<re.Match object; span=(0, 1), match=b'8:'>

Я проверил источники Python для функции соответствия, из которой выглядит чисто#defines и другие настройки.Сталкивались ли вы с подобной проблемой, как вы решили это?Заранее спасибо.:)

PS Протестировано с любым торрент-файлом, открытым в режиме rb.(например, http://releases.ubuntu.com/19.04/ubuntu-19.04-desktop-amd64.iso.torrent)

PPS У меня не было этой проблемы с python 2. Кажется, это может быть связано с newline types, но файл открыт в режиме rb.

UPD: Сделан обходной путь с установкой i = -1 для режима Windows. Кажется, проблема была с первым байтом. Но не могли бы вы объяснить, почему это происходит?

1 Ответ

0 голосов
/ 23 сентября 2019

Как вы упомянули, похоже, что это связано с типами новой строки.

Попробуйте добавить newline='' в вызов функции open() при открытии файла, это должно включить универсальный режим новой строки.

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