The difficulty here is that you want to match a sequence of upper case letters, digits or spaces, but you don't want to match only a space, and probably you don't want to match anything that does not contain any digits.
Although there may be a simpler form, one thing that would work would be to insist on there being a digit, with any number of the other characters both before and after it.
The pattern should also start and finish on a word boundary, so that e.g. it does not strip off the capital letter at the start of the following word.
import re
re.sub(r'\b[A-Z\d ]*\d[A-Z\d ]*\b', '', address)
Output for the examples in the question:
Amsterdam
Aberdeen
Shrewsbury
Edinburh
Newport
San Miguel de Tucumán
Lancashire
Manchester
Oshawa
Output for 20007 Washington mentioned elsewhere in a comment:
Washington
Inventing an example with the code at the end, namely:
Some other address SW1A 1AA
It gives:
Some other address
Note: if some of the codes do not contain any digits, then maybe what you could do is replace the \d in the middle with (\d|[A-Z]{2}) so that it is also sufficient if it contains two upper case letters together. You would not want to treat a single upper case letter as a code, e.g. A Coruña.