Change the or's to and's in your while statement.
For "or", as long as there is a "True", the whole statement evaluates to True. Therefore your original 'while' condition always evaluates to "True".
'While' only terminates when the condition evaluates to False. However, in your original condition, that will never happen because:
All three conditions cannot happen(be False) at the same time. The value cannot be '.', '!', and '?' at the same time.
This means: At least two of your three conditions always evaluate to True. Consequently, the 'while' will never evaluate to False, because any permutation of True||False||False will evaluate to True.