Тестирование пробелов с использованием Regex с флагами LOCALE и UNICODE в Python - PullRequest
1 голос
/ 03 апреля 2012

Я хочу написать тестовый скрипт на Python, где в.

  1. Я даю строку, отличную от ASCII, в локали, которая имеет другой набор символов пробела, а затем использую '\ s' с флагом re.LOCALE, чтобы увидеть вывод.
  2. Я бы тоже хотел это дополнить. Я хочу \S и вижу, что для этого МЕСТА возвращено незаполненное пространство.

Теперь, как я мог этого достичь? Какой LOCALE я должен выбрать, чтобы увидеть четкую разницу в выводе из ASCII.

# -*- Proper encoding -*-
import re
pat = re.compile('\s*', re.LOCALE)
string = "string"  # Proper Replacement String?
result = pat.match(string)
print result.group(0)

Я использую Ubuntu и следую за моим текущим языком моей оболочки.

$locale
LANG=en_SG.UTF-8
LANGUAGE=en_SG:en
LC_CTYPE="en_SG.UTF-8"
LC_NUMERIC="en_SG.UTF-8"
LC_TIME="en_SG.UTF-8"
LC_COLLATE="en_SG.UTF-8"
LC_MONETARY="en_SG.UTF-8"
LC_MESSAGES="en_SG.UTF-8"
LC_PAPER="en_SG.UTF-8"
LC_NAME="en_SG.UTF-8"
LC_ADDRESS="en_SG.UTF-8"
LC_TELEPHONE="en_SG.UTF-8"
LC_MEASUREMENT="en_SG.UTF-8"
LC_IDENTIFICATION="en_SG.UTF-8"
LC_ALL=

Кстати, у меня меньше опыта работы с входами / выходами, учитывающими UNICODE или LOCALE (если это имеет значение). Все, что я знаю, это то, что я могу набирать буквы юникода, используя кодовые точки на терминале.

1 Ответ

1 голос
/ 12 апреля 2012

Отвечая на мой вопрос после поиска исходного кода.

В исходном коде Python _sre.c

Определение LOCALE Space это -

#define SRE_LOC_IS_SPACE(ch) (!((ch) & ~255) ? isspace((ch)) : 0)

А определение категории NON_SPACE - это отрицание пробела. Вот и все.

Теперь, учитывая это определение, мы видим, что для значений символов, превышающих 255, проверка вообще не производится. Просто ли ascii isspace рассматривается, когда установлен флаг LOCALE. И действительно, флаг re.LOCALE не оказывает дополнительного влияния на сопоставление пробела или непробельного символа.

Для Unicode логика рассматривается в unicodeobject.c, и я вижу, что это просто супер-набор пробелов ascii. Все символы пробела ascii также являются символами юникода.

Учитывая это, невозможно написать программу на Python. где вы можете проверить наличие «исключительного пробела в локали или юникоде», исключая пробелы ascii.

...