Description
I recommend using optional lookaheads to search and search for a location or timeframe, if they exist.
^(?=(?:.*?on\s(today|tomorrow|sunday|monday|tuesday|wednesday|thursday|friday|saturday|sunday|this week))?)(?=(?:.*?in\s([a-z]+))?)

This regex will do the following:
Live Demo
https://regex101.com/r/rN9hG2/1
weather on sunday
weather on sunday in vienna
weather in vienna
weather in vienna on sunday
[0][1] = sunday
[0][2] =
[1][1] = sunday
[1][2] = vienna
[2][1] =
[2][2] = vienna
[3][1] = sunday
[3][2] = vienna
NODE EXPLANATION
(?= look ahead to see if there is:
(?: group, but do not capture (optional
(matching the most amount possible)):
.*? any character except \n (0 or more
times (matching the least amount
possible))
on 'on'
\s whitespace (\n, \r, \t, \f, and " ")
( group and capture to \1:
today 'today'
| OR
tomorrow 'tomorrow'
| OR
sunday 'sunday'
| OR
monday 'monday'
| OR
tuesday 'tuesday'
| OR
wednesday 'wednesday'
| OR
thursday 'thursday'
| OR
friday 'friday'
| OR
saturday 'saturday'
| OR
sunday 'sunday'
| OR
this week 'this week'
) end of \1
)? end of grouping
) end of look-ahead
(?= look ahead to see if there is:
(?: group, but do not capture (optional
(matching the most amount possible)):
.*? any character except \n (0 or more
times (matching the least amount
possible))
in 'in'
\s whitespace (\n, \r, \t, \f, and " ")
( group and capture to \2:
[a-z]+ any character of: 'a' to 'z' (1 or
more times (matching the most amount
possible))
) end of \2
)? end of grouping
) end of look-ahead