For the simple case here where a question is asked once, how fast it works is often not important.
A bigger gap is whether to use regular expressions to encapsulate sometimes complex possibilities.
In this case, you wanted to match several similar possibilities:
Good Morning
Goodmorning
The main differences are an optional space and capitalization of the M in morning. But, what if you wanted to accept the above in all upper case or all lower case or many other combinations and perhaps even with spaces before or after or more in between or accept tabs or ignore something like underscores as in Good_Morning. You can imagine quite a few scenarions including making good morn acceptable.
For some such cases, although standard python functions like converting it to all lower case, can be used, regular expressions are very useful as you can ask to match optional whitespace, then the letters in either case for G o o d then optional whitespace and so on.
But that tends to come with a cost as underneath it all, a little machine is built that traverses your text and has lots of hidden activities like if statements or some kinds of recursion. Yet, it can be fast enough as it can very tersely allow fairly complicated analyses.
If there is a class being taken that wants to exercise what you have been learning, of course, using somewhat more advanced language features is not yet the right choice.
But just imagine if your task was not to translate this set of words from English to German, but to accept a larger set of phrases not just from English but French and Spanish and Italian and Hungarian and Russian and in all cases produce the same output telling you how to do it in German. Paul’s solution of asking for phrases in (tuple items) might work fine, if you have UNICODE, but would not easily deal with issues like optional spaces or upper/lower case. The regular expression allows you to say something like “(pattern1)|(pattern2)|pattern3)” and even be able to know which one matched. There is the usual tradeoff as in a good programmer can be highly productive in how they state the problem and the spaghetti code generated need not be seen and may work slower and yet do more.
As a rule, the implementation of some things matters. You can build your own function that takes a tuple and the input as arguments and does a loop over the contents of the tuple and returns if it matches anything. This is a very general solution that works for one or a dozen or millions of entries. Sometimes it finds and exits quickly and sometimes it may search to the end and perhaps not find it. For just two items , it likely is slower than just doing your own two comparisons and note python sometimes is optimized so that A or B returns True as soon as A is true and skips evaluating B. The speed depends on whether you have A, or B or neither.
But back to your original question, I think you can see what went wrong as any intuition that you can use the “or” verb this way is not quite right.