cpv = re.compile(r'(\d{8})(?:[ -.\t/\\]*)(\d{1}\b)')
for m in re.finditer(cpv, ex):
cpval,chk = m.groups()
print("{0}-{1}".format(cpval,chk))
применительно к вашему примеру возвращает данные
30124120-1
30124120-1
30124120-1
30124120-1
30124120-1
Регулярное выражение можно прочитать как
(\d{8}) # eight digits
(?: # followed by a sequence which does not get returned
[ -.\t/\\]* # consisting of 0 or more
) # spaces, hyphens, periods, tabs, forward- or backslashes
(\d{1}\b) # followed by one digit, ending at a word boundary
# (ie whitespace or the end of the string)
Надеюсь, это поможет!