In Haskell (which is the language I have most pattern matching experience in), you can pattern match in a lot of places implicitly so you end up using it often. I often break tuple data apart into useful names instead of using fst, snd, and the like. If I have data that can be one of several forms (online examples usually mention expressions for parsers), I would use the branching feature in place of a switch or cond. I also break the data into useful names rather than using named fields.
Contrived example in messy psuedocode: Say you had a network protocol with a message type like
Message = Move Int,Int or Login String or Logout or Say String,StringI would write the function
def Handle(Message) Move X, Y: <move the character by X and Y> Login Name: print 'Hello, ' + Name Logout: print 'Bye!' Say Name, Text: print Name + " says " + Text
Is this helpful?