Это будет сделано для UTF8, если вы хотите сделать это в регулярном выражении.
import re
partial="\xc2\x80\xc2\x80\xc2"
re.sub("([\xf6-\xf7][\x80-\xbf]{0,2}|[\xe0-\xef][\x80-\xbf]{0,1}|[\xc0-\xdf])$","",partial)
"\xc2\x80\xc2\x80"
Его покрытие от U + 0080 (2 байта) до U + 10FFFF (4 байта) utf8 строк
Это действительно прямо как UTF8 алгоритм
От U + 0080 до U + 07FF Потребуется 2 байта 110yyyxx 10xxxxxx
Это означает, что если вы видите только один байт в конце, например 110yyyxx (от 0b11000000 до 0b11011111)
Это [\xc0-\xdf]
, оно будет частичным.
От U + 0800 до U + FFFF требуется 3 байта 1110yyyy 10yyyyxx 10xxxxxx
Если вы видите только 1 или 2 байта в конце, он будет частичным.
Будет соответствовать этому шаблону [\xe0-\xef][\x80-\xbf]{0,1}
Из U + 10000 – U + 10FFFF требуется 4 байта 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx
Если вы видите только 1-3 байта в конце, он будет частичным
Будет соответствовать этому шаблону [\xf6-\xf7][\x80-\xbf]{0,2}
Обновление:
Если вам нужна только базовая многоязычная плоскость, вы можете сбросить последний паттерн. Это подойдет.
re.sub("([\xe0-\xef][\x80-\xbf]{0,1}|[\xc0-\xdf])$","",partial)
Дайте мне знать, если есть какие-либо проблемы с этим регулярным выражением.