Python и регулярное выражение с Unicode

Примечание: Неинициализированное смещение строки: *

Как видно из названия, возникает такой тип ошибки, когда вы, скорее всего, пытаетесь перебрать или найти значение из массива с не- существующий ключ.

Считаем, что вы пытаетесь показать каждую букву из $string

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

. Вышеприведенный пример сгенерирует ( онлайн-демонстрацию ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

И, как только скрипт заканчивается эхом D, вы получите ошибку, потому что внутри цикла for() вы сказали PHP, чтобы показать вам от первого до пятого символа строки из 'ABCD' Что, существует, но поскольку цикл начинает отсчитываться от 0 и эха D к моменту достижения значения 4, он выдает ошибку смещения.

Аналогичные ошибки:

81
задан Martin Thoma 9 August 2017 в 11:05
поделиться

2 ответа

Вы используете Python 2.x или 3.0?

, Если Вы используете 2.x, попытайтесь заставить regex представить строку unicode-Escape в виде строки с 'u'. Так как это - regex, это - хорошая практика, чтобы заставить Ваш regex представить необработанную строку в виде строки с 'r'. Кроме того, помещение Вашего всего шаблона в круглых скобках является лишним.

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...)

http://docs.python.org/tutorial/introduction.html#unicode-strings

Редактирование:

Это - также хорошая практика для использования ре. UNICODE/РЕ. U / (? u) флаг для unicode regexes, но это только влияет на псевдонимы класса символов как \w или \b, которого этот шаблон не использует никого и так не был бы затронут.

107
ответ дан ʞɔıu 24 November 2019 в 09:34
поделиться

Используйте строки unicode. Используйте ре. Флаг UNICODE .

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
                      re.UNICODE)
>>> myre
<_sre.SRE_Pattern object at 0xb20b378>
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'
>>> result = myre.sub('', mystr)
>>> len(mystr), len(result)
(38, 22)
>>> print result
بسم الله الرحمن الرحيم

Read статья Joel Spolsky названный Абсолютный минимум Каждый Разработчик программного обеспечения Absolutely, Положительно Должен Знать О Unicode и Наборах символов (Никакие Оправдания!)

69
ответ дан nosklo 24 November 2019 в 09:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: