Это происходит из моего опыта JavaScript в RegExp, но он должен быть относительно похожим ...
Я не думаю, что вам нужно оглядываться назад, вам просто нужны не захватившие группы. Они все еще соответствуют вводу, но они не фиксируются совпадением:
(?:<body\b[^>]*>)(.*?)(?:<\/body>)
Когда вы делаете совпадение, возвращаемые совпадения будут включать только содержимое (но не открывающие / закрывающие теги тела).