You mention that the city name is a variable length, can we assume that the state and zip are fixed lengths (2 letters for state, not sure how many letters you have in a zip code - being from the UK an' all...)?
If there are 2 letters for state, a space, then say 6 digits for zip code, then try the following (assuming your data is in column A):
=right(trim(a1),6) [for the zip]
=MID(TRIM(A1),LEN(TRIM(A1))-8,2) [state]
=left(trim(a1),len(trim(a1))-10) [for the city]
Note that the trim is used to get rid of any leading or trailing spaces that may exist in your data, but which aren't obvious.