Trinsec mentioned a bug in ANSI with grab(), where it has to do a (non-wildcard) match across different colours, like:
think grab(ansi(r,t)[ansi(b,est)],*te*)
The problem seems to be that quick_wild is given arguments containing ANSI escape codes, and they aren't being stripped before the comparison is done. Just changing quick_wild so that it remove_markup()s the args it passes on to check_literal/quick_wild_new fixes the problem (the grab(), etc, match correctly).
I haven't submitted a patch, though, because it seems rather inefficient - in graball(), for instance, I believe the wildcard pattern is passed to quick_match once for every list element, so it would seem to be better for it (graball) to remove_markup the pattern once, and just call quick_match with the (markupless) string.