Do you want to capture everything between a "!" and a "#" as the contents for the tags column?
If so, try:
Code:
^(?P<author>((?!\s-\s).)+)\s-\s(?:(?:\[\s*)?(?P<series>.+)\s(?P<series_index>[\d\.]+)(?:\s*\])?\s)?(?:\s*!(?P<tags>.+)#\s+)?(?P<title>[^(]+)(?:\(.*\))?
(My addition is in red.)