Python регулярное выражение re.finditer странное поведение с match.end () - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь найти позиции шаблонов в файле, и я использую Python регулярное выражение. Когда я запускаю приведенный ниже код, печатаются несколько начальных позиций, но печатается только одна конечная позиция, соответствующая последней начальной позиции. Нижний оператор печати также печатается только один раз. Почему нет значения match.end() для каждого значения match.start()? Файл представляет собой файл .obj.

import re
import binascii


def findByte(b,file):
    f = open(file, "rb").read()
    f = binascii.hexlify(f)
    regex = b + "(?=(?:[\\da-fA-F]{2})*$)"

    for match in (re.finditer(regex, f)):


        s = match.start()
        print("S" + str(s))

        e = match.end()
        print("E" + str(e))

        g = match.group()
        print(g)

        print ('String match "%s" at %d:%d' % (g, s, e))

findByte("ca","demo.obj")

Когда я запускаю его, печатаются следующие ответы.

S0
S64
S184
S252
E254
ca
String match "ca" at 252:254

Если я вместо этого пишу

def findByte(b,file):
    f = open(file, "rb").read()
    f = binascii.hexlify(f)
    regex = b + "(?=(?:[\\da-fA-F]{2})*$)"

    m = re.findall(regex,f)
    print(m)

findByte("ca","demo.obj")

печатное значение

['ca', 'ca', 'ca', 'ca']

1 Ответ

0 голосов
/ 20 февраля 2020

Проверяя фактический код, который вы вставили, ясно, что вы совершили кардинальный Python грех смешивания табуляции и пробелов, и он кусает вас (попробуйте выбрать начальный пробел в вашем собственном коде на этой странице; вы увидите некоторые из них выбираются как блоки из четырех пространств за раз, в то время как другие части имеют единичную пространственную зернистость). Ваш редактор показывает вам табуляцию как эквивалентную четырем пробелам, но в вставленном вами коде у вас чисто отступ на основе табуляции до print("S" + str(s)), затем четыре пробела и табуляция в качестве отступа для последующих строк.

Большинство таких смешанных отступов отвергается Python 3, но Python 2 более гибок (дает вам веревку, чтобы повеситься), что может быть тем, что здесь происходит (Python 2 - конец жизни по состоянию на начало этого года, поэтому, если вы пишете новый код, я бы предложил переключиться по этой и многим другим причинам). Ваш код выглядит , как будто все это в for l oop, но большей его части нет.

Замените все вкладки четырьмя пробелами и перенастройте ваш редактор на всегда расширять табуляцию пробелами в будущем, так что вас это не побеспокоит в будущем; Python стиль соответствует четырем пробелам с без вкладок по причине.

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