Пипарсинг излишним для этого? Возможно, но без особых страданий, действительно доставляет желаемый результат без чёртов обратной косой черты, чтобы избежать символов '{', '|' или '}'. Кроме того, нет необходимости в преобразовании целых чисел и тому подобном после разбора - действия разбора позаботятся о подобных вещах во время разбора.
from pyparsing import Word, Suppress, alphas, alphanums, nums, delimitedList
LBRACE,RBRACE,VERT = map(Suppress,"{}|")
word = Word(alphas,alphanums)
integer = Word(nums)
integer.setParseAction(lambda t: int(t[0]))
patt = (LBRACE*2 + delimitedList(word|integer, VERT) + RBRACE*2)
patt.setParseAction(lambda toks:tuple(toks.asList()))
s = "a word {{bla|123|456}} another {{bli|789|123}} some more text {{blu|789}} and more"
print tuple(p[0] for p in patt.searchString(s))
Печать:
(('bla', 123, 456), ('bli', 789, 123), ('blu', 789))