Например, вот так:
def GenerateAll(source, rep):
for comb in itertools.combinations(range(len(source)), len(source)-len(rep)):
s = list()
prev = 0
for (i, j) in enumerate(comb):
s.append(source[j]);
yield "".join(s)
Обратите внимание, перебираем не сочетания из удаляемых позиций, а из 22 оставляемых (кстати, у вас числа не бьются, 48+22 = 60 != 64). Тут порядок в ответе будет обратный (первая строка будет "xxxxxx...xxxx12..." а не "12..xxx..xx". Если нужен тот же порядок, то будет чуть сложнее:
def GenerateAll(source, rep):
for comb in itertools.combinations(range(len(source)), len(rep)):
s = list()
prev = 0
last = 0
for (i, j) in enumerate(comb):
while (last < j):
s.append(source[last]);
last += 1
last += 1
while (last < len(source)):
s.append(source[last]);
last += 1
yield "".join(s)
Это не самое питонистое решение, возможно в какой-то библиотеке уже есть готовая функция, которая вырезает из строки символы по индексам.