import re rows= [ '(event) (tag) [group (artist)] title (form) [addition1] [addition2]', '(event) [group (artist)] title (form) [addition1]', '[event] [group (artist)] title (form) (addition1)', '(tag) [group (artist)] title', '[group (artist)] title', 'title', ] p = re.compile(ur'^(?:(?:^[\[()](?P[^)\]]+)[)\]](?=.+[\])]$)\s)?(?:[(【](?P(?<=^[(【])[^】)]+(?=.+[\w】]$)|(?<=\)\s\()[^)]+(?=\)\s\[))[】)]\s)?\[(?:(?P[^(\]]+)\s+\((?P[^)]+)\)\])\s+)?(?P[^(\n)【]+)(?:\s*[\(【](?P<form>[^)】]+)[)】](?:\s*[\[(](?P<add>[^\])]+)[\])])?(?:\s*[\[(](?P<add2>[^\])]+)[\])])?)?$') for r in rows: [m.groupdict() for m in p.finditer(r)] print m.groupdict()