Anyway, I don't think that the expression you posted is correct for all the listed cases, in the previous example it doesn't catch the phrase because of the space and the "[A-z]+" part expected before the ":"

I added space before the list, so that we'll skip comparing the list for spaces, and start from the beginning of a word. Will prevent list matching to flask and such. Minimal benefit, but some regardless.

I removed ((e)?s)? completely, except s?. I'm not native with english, so I might be incorrect with this one, but I thought that "es" does not match with anything else than "hiss" (hisses), thus we really don't need the letter e elsewhere, so I added it behind the hiss, with questionmark: |hisse?|. The questionmark should affect only the letter e in that position. The lack of e at the end of the list impacts every matched string. I also removed the closures around s at the end of the list, because we don't need 'em for a single symbol.

I also added ()? between question mark after list and : to make something like "says:" to work by enclosing everything inbetween to nice MAYBE.

If you need the regex only for matching, not for capturing, you can drop .+$ from the end of the regex.

Then there's lookbehind which could be used to finegrain further, but I don't feel THAT smart today.

As a side note, .+? does not equal to .*. Question mark makes quantifier (like + and *) lazy, as I (re?)learned after posting ma first edit.

Note: If someone knows something better than I about what I wrote, I'm all open for education.