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"""
[0-9]{1,4}((\.|\-)?[A-Za-z])? # max 4 digits followed optionally by a letter separated by , or - optionally.
"""
# those could be separated by:
separator = r"""(,?\s?)""" # comma followed optionally by space
# code to get the matches with finditer
pattern2 = fr"""(({numerical}
(({separator})?|\s?))+
|
{numerical} # single case
)"""
refs = re.finditer(pattern2, text, re.VERBOSE, )
for element in refs:
print(element.group())
aW1wb3J0IHJlCgp0ZXh0ID0gIiIiY2FrZXMgMTAgYXJlIGdvb2QuCmNha2VzIDEwYyBhcmUgZ29vZC4KY2FrZXMgMjAgMjEgMjIgYXJlIGdvb2QuCmNha2VzIDMwLCAzMSwgMzIgYXJlIGdvb2QuCmNha2VzIDQwYSwgNDBiLCA0MGMgYXJlIGdvb2QuIiIiCgpudW1lcmljYWwgPSByIiIiClswLTldezEsNH0oKFwufFwtKT9bQS1aYS16XSk/ICAgIyBtYXggNCBkaWdpdHMgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIGxldHRlciBzZXBhcmF0ZWQgYnkgLCBvciAtIG9wdGlvbmFsbHkuCiIiIgoKIyB0aG9zZSBjb3VsZCBiZSBzZXBhcmF0ZWQgYnk6CnNlcGFyYXRvciA9IHIiIiIoLD9ccz8pIiIiICAjIGNvbW1hIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgc3BhY2UKCiMgY29kZSB0byBnZXQgdGhlIG1hdGNoZXMgd2l0aCBmaW5kaXRlcgpwYXR0ZXJuMiA9IGZyIiIiKCh7bnVtZXJpY2FsfSAKICAgICAgICAgICAgICAgICgoe3NlcGFyYXRvcn0pP3xccz8pKSsKICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgIHtudW1lcmljYWx9ICMgc2luZ2xlIGNhc2UKICAgICAgICAgICAgICAgICkiIiIKcmVmcyA9IHJlLmZpbmRpdGVyKHBhdHRlcm4yLCB0ZXh0LCByZS5WRVJCT1NFLCApCmZvciBlbGVtZW50IGluIHJlZnM6CiAgICBwcmludChlbGVtZW50Lmdyb3VwKCkp