<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_iso3_country_code_fuzzy(cls, country, use_live=True, exception=None):
 # type: (str, bool, Optional[ExceptionUpperBound]) -> Tuple[[Optional[str], bool]] """Get ISO3 code for cls. A tuple is returned with the first value being the ISO3 code and the second showing if the match is exact or not. Args: country (str):
 Country for which to get ISO3 code use_live (bool):
 Try to get use latest data from web rather than file in package. Defaults to True. exception (Optional[ExceptionUpperBound]):
 An exception to raise if country not found. Defaults to None. Returns: Tuple[[Optional[str], bool]]: ISO3 code and if the match is exact or (None, False). """

        countriesdata = cls.countriesdata(use_live=use_live)
        iso3 = cls.get_iso3_country_code(country,
                                         use_live=use_live)  # don't put exception param here as we don't want it to throw

        if iso3 is not None:
            return iso3, True

        def remove_matching_from_list(wordlist, word_or_part):
            for word in wordlist:
                if word_or_part in word:
                    wordlist.remove(word)

        # fuzzy matching
        expanded_country_candidates = cls.expand_countryname_abbrevs(country)
        match_strength = 0
        matches = set()
        for countryname in sorted(countriesdata['countrynames2iso3']):
            for candidate in expanded_country_candidates:
                simplified_country, removed_words = cls.simplify_countryname(candidate)
                if simplified_country in countryname:
                    words = get_words_in_sentence(countryname)
                    new_match_strength = 0
                    if simplified_country:
                        remove_matching_from_list(words, simplified_country)
                        new_match_strength += 32
                    for word in removed_words:
                        if word in countryname:
                            remove_matching_from_list(words, word)
                            new_match_strength += 4
                        else:
                            if word in cls.major_differentiators:
                                new_match_strength -= 16
                            else:
                                new_match_strength -= 1
                    for word in words:
                        if word in cls.major_differentiators:
                            new_match_strength -= 16
                        else:
                            new_match_strength -= 1
                    iso3 = countriesdata['countrynames2iso3'][countryname]
                    if new_match_strength > match_strength:
                        match_strength = new_match_strength
                        matches = set()
                    if new_match_strength == match_strength:
                        matches.add(iso3)

        if len(matches) == 1 and match_strength > 16:
            return matches.pop(), False

        # regex lookup
        for iso3, regex in countriesdata['aliases'].items():
            index = re.search(regex, country.upper())
            if index is not None:
                return iso3, False

        if exception is not None:
            raise exception
        return None, False