You can use re.search
to check for the pattern r'(\[(?:JIRA\-\d+,?)*\])\s+(\[TAG-[\d.]+\])\s+:\s+(.*)$'
and if it matches, <match>.groups()
would contain the tickets, tag and description
If the regexp pattern is too strict for you, you can use the simple pattern r'(\[.*?\]) (\[.*?\]) : (.*)$'
instead
>>> import re
>>>
>>> s = "[JIRA-1115,JIRA-1917] [TAG-0.3.4] : List of tickets"
>>> tickets, tag, descr = re.search(r'(\[(?:JIRA\-\d+,?)*\])\s+(\[TAG-[\d.]+\])\s+:\s+(.*)$', s).groups()
>>> tickets, tag, descr
('[JIRA-1115,JIRA-1917]', '[TAG-0.3.4]', 'List of tickets')
>>>
>>> s = "[JIRA-1116] [TAG-0.3.5] : Only 1 ticket now"
>>> tickets, tag, descr = re.search(r'(\[(?:JIRA\-\d+,?)*\])\s+(\[TAG-[\d.]+\])\s+:\s+(.*)$', s).groups()
>>> tickets, tag, descr
('[JIRA-1116]', '[TAG-0.3.5]', 'Only 1 ticket now')