Как убрать юникод "пунктуация" из строки Python - PullRequest
7 голосов
/ 24 марта 2011

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

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

Ответы [ 3 ]

11 голосов
/ 24 марта 2011

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

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

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

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

в вашем случае:

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

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

1 голос
/ 24 марта 2011

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

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

Например, допустим, вы знаете, что в "стране" будут только заглавные буквы английского алфавита и пробелы, которые вы могли бы убрать из всего остального, включая вашу противную юникодную букву, такую ​​как:

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

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

0 голосов
/ 24 марта 2011

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


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