<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def find(self, regexp, negate_regexp=False, class_pattern=None, find_fnc=re.search, refresh_cache=False):
 """ yield the full path of the matching regular expression and the match itself """

        if refresh_cache or not hasattr(self, 'cache'):
            self._populate_cache()

        b = self.cache
        split_regexp = regexp.split('/')

        # traverse as deep as possible in the cache
        # special case if the first character is not the root, i.e. not ""
        if split_regexp[0] == '':
            for d in split_regexp:
                if d in b:
                    b = b[d]
                else:
                    break
        else:
            b = b['']

        # perform the search
        for path, (obj, classname) in b['obj']:
            if class_pattern:
                if not fnmatch(classname, class_pattern):
                    continue
            joined_path = os.path.join(*['/', path, obj])
            result = find_fnc(regexp, joined_path)
            if (result is not None) ^ negate_regexp:
                yield joined_path, result