import re
text = """cakes 10 are good.
cakes 10c are good.
cakes 20 21 22 are good.
cakes 30, 31, 32 are good.
cakes 40a, 40b, 40c are good."""
numerical = r"""\b[0-9]{1,4}(?:[.-]?[A-Za-z])?"""
# those could be separated by:
separator = r""",?\s"""
# code to get the matches with finditer
pattern2 = fr"""{numerical}(?:{separator}{numerical})*"""
refs = re.finditer(pattern2, text, re.VERBOSE)
for element in refs:
print(element.group())
aW1wb3J0IHJlCgp0ZXh0ID0gIiIiY2FrZXMgMTAgYXJlIGdvb2QuCmNha2VzIDEwYyBhcmUgZ29vZC4KY2FrZXMgMjAgMjEgMjIgYXJlIGdvb2QuCmNha2VzIDMwLCAzMSwgMzIgYXJlIGdvb2QuCmNha2VzIDQwYSwgNDBiLCA0MGMgYXJlIGdvb2QuIiIiCgpudW1lcmljYWwgPSByIiIiXGJbMC05XXsxLDR9KD86Wy4tXT9bQS1aYS16XSk/IiIiCgojIHRob3NlIGNvdWxkIGJlIHNlcGFyYXRlZCBieToKc2VwYXJhdG9yID0gciIiIiw/XHMiIiIKCiMgY29kZSB0byBnZXQgdGhlIG1hdGNoZXMgd2l0aCBmaW5kaXRlcgpwYXR0ZXJuMiA9IGZyIiIie251bWVyaWNhbH0oPzp7c2VwYXJhdG9yfXtudW1lcmljYWx9KSoiIiIKCnJlZnMgPSByZS5maW5kaXRlcihwYXR0ZXJuMiwgdGV4dCwgcmUuVkVSQk9TRSkKZm9yIGVsZW1lbnQgaW4gcmVmczoKICAgIHByaW50KGVsZW1lbnQuZ3JvdXAoKSk=