\ u0000-\uD7FFおよび\uE000-\ uFFFFの範囲のUnicode文字は、UTF8で3バイト(またはそれ以下)のエンコーディングになります。 \ uD800- \ uDFFFの範囲は、マルチバイトUTF16用です。 Pythonはわかりませんが、これらの範囲外に一致する正規表現を設定できるはずです。
pattern = re.compile("[\uD800-\uDFFF].", re.UNICODE)
pattern = re.compile("[^\u0000-\uFFFF]", re.UNICODE)
質問本文にDenilsonSáのスクリプトからPythonを追加して編集します:
re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
filtered_string = re_pattern.sub(u'\uFFFD', unicode_string)