Как удалить unicode «пунктуацию» из строки Python

Вот в чем проблема: у меня строка unicode в качестве входных данных для запроса sqlite python. Запрос не выполнен («нравится»). Оказывается, строка «ФРАНЦИЯ» не имеет 6 символов, у нее семь. И седьмой. , , unicode U + FEFF, свободное пространство без пробелов.

Как же я беру в ловушку класс таких вещей перед запросом?

    Вы можете использовать категории unicodedata как часть таблицы данных юникода в Python:

    >>> unicodedata.category(u'a') 'Ll' >>> unicodedata.category(u'.') 'Po' >>> unicodedata.category(u',') 'Po' 

    Категории для символов пунктуации начинаются с «P», как вы можете видеть. Поэтому вам нужно отфильтровать символ char с помощью char (используя понимание списка).

    Смотрите также:

    в твоем случае :

     >>> unicodedata.category(u'\ufeff') 'Cf' 

    Таким образом, вы можете выполнить некоторый белый список на основе категорий для символов.

    Как правило, подтверждение ввода должно выполняться с использованием белого списка допустимых символов, если вы можете определить такую ​​вещь для своего случая использования. Затем вы просто выбрасываете все, что не входит в белый список (или вообще отклонять вход).

    Если вы можете определить набор допустимых символов, вы можете использовать регулярное выражение, чтобы вычеркнуть все остальное.

    Например, скажем, что вы знаете, что «страна» будет иметь только английские буквы и пробелы в верхнем регистре, вы можете разделить все остальное, в том числе свое неприятное письмо юникода, например:

     >>> import re >>> country = u'FRANCE\ufeff' >>> clean_pattern = re.compile(u'[^AZ ]+') >>> clean_pattern.sub('', country) u'FRANCE' 

    Если вы не можете определить набор допустимых символов, у вас серьезные проблемы, потому что ваша задача – предвидеть все десятки тысяч возможных неожиданных символов Юникода, которые могут быть брошены на вас, – и все больше и больше добавляются к спецификации, поскольку языки эволюционировали с годами.

    Это также знак байта, спецификация. Просто сначала очистите свои строки, чтобы устранить их, используя что-то вроде:

     >>> f = u'France\ufeff' >>> f u'France\ufeff' >>> print f France >>> f.replace(u'\ufeff', '') u'France' >>> f.strip(u'\ufeff') u'France'