Contains and not contains are good but we need also IS and ISNOT to get exact matches.
It's slightly complicated, but you can stack the :not, :contains, and :has
selectors to get exactly the match you need. e.g.
p:contains('DOG'):not(:contains('DOGGED'))
will match any para that contains 'DOG' except if those that contains 'DOGGED'.
But if there is multiple DOG*? I want only DOG, not DOGGED, DOGGY, DOGEMON?