Os caracteres Unicode nos intervalos \u0000-\uD7FF e \uE000-\uFFFF terão codificações de 3 bytes (ou menos) em UTF8. O intervalo \uD800-\uDFFF é para UTF16 multibyte. Eu não conheço python, mas você deve poder configurar uma expressão regular para corresponder fora desses intervalos.
pattern = re.compile("[\uD800-\uDFFF].", re.UNICODE)
pattern = re.compile("[^\u0000-\uFFFF]", re.UNICODE)
Edite adicionando Python do script do Denilson Sá no corpo da pergunta:
re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
filtered_string = re_pattern.sub(u'\uFFFD', unicode_string)