If we would be having the same uppercase and lowercase patterns similar to those listed in the question, we would be starting with a simple expression, such as:
([A-Z][a-z]+\s)+
Test
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
regex = r"([A-Z][a-z]+\s)+"
test_str = ("[bla bla] 1990 The Bronx Warriors 1982\n"
"[ bl bla] 2012 2009 [ bla bla ]\n"
"[BLA VLA] The Matrix 1999 bla bla [bla bla]\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
RegEx
If this expression wasn't desired or you wish to modify it, please visit regex101.com.
RegEx Circuit
jex.im visualizes regular expressions:

match = re.match("\[?.*?\](.*)([0-9]{4})(.*)\[?.*\]?", title). You were almost there. Now the first group will match movie title, and the second group it's year.