Bug 5262 - модуль re: буква ё почему-то не входит в диапазон [а-я]
: модуль re: буква ё почему-то не входит в диапазон [а-я]
Status: CLOSED WORKSFORME
: Sisyphus
(All bugs in Sisyphus/python-base)
: unstable
: all Linux
: P2 major
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2004-09-30 13:14 by
Modified: 2008-02-15 22:53 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2004-09-30 13:14:32
if re.search('([^а-я])', 'ё').group(1) != None:
   print "Error"
------- Comment #1 From 2004-09-30 13:16:50 -------
Сорри не так

if re.search('([^а-я])', 'ё') != None:
   print "Error"
------- Comment #2 From 2004-09-30 18:18:19 -------
Если вы не включимли локаль, то она туда действительно не входит. 
А если вы включили локаль то все работает. Пример следует. 


18:18:58 (cray@fire)  /home/cray/.home>  python 
Python 2.3.3 (#1, Jul  3 2004, 17:16:23) 
[GCC 3.3.3 20040412 (ALT Linux, build 3.3.3-alt5)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> import locale 
>>> locale.setlocale(0,"ru_RU.KOI8-R") 
'ru_RU.KOI8-R' 
>>> re.search('([^а-я])', 'ё').group(1) 
'\xa3' 
>>> print re.search('([^а-я])', 'ё').group(1) 
ё 
>>> map(ord,"аёя") 
[193, 163, 209] 
>>> 




------- Comment #3 From 2004-10-01 10:30:54 -------
Не все так просто. Наверное я неправильно написал пример. В своей программе я
использовал unicode, думаю на строки в этой кодировке не должны
распространяться
проблемы локали. Если же должны, то какую локаль мне поставить?

>>> a = unicode ("[а-я]", "koi8-r");
>>> b = unicode ("ё", "koi8-r");
>>> re.compile (a, re.U ).match(b)
>>> re.compile (a, re.U).match(unicode("е", "koi8-r"))
<_sre.SRE_Match object at 0x403c68e0>


>>> locale.setlocale(0,"ru_RU.KOI8-R")
'ru_RU.KOI8-R'
>>> a = unicode ("[а-я]", "koi8-r");
>>> b = unicode ("ё", "koi8-r");
>>> re.compile (a, re.U).match(b)
>>> re.compile (a, re.U).match(unicode("е", "koi8-r"))
<_sre.SRE_Match object at 0x403c62f8>
------- Comment #4 From 2004-11-03 02:30:56 -------
> Не все так просто. Наверное я неправильно написал пример. В своей программе я 

Нет, это я неправильно ответил. Причем совсем неправильно - мой пример 
подтверждает вашу правоту, а не мою. Видимо, я перегрелся тогда, извините. 

Похоже на то, что модуль sre забивает на локализацию диапазонов. Баг это или 
фича - нужно разбираться. Локаль модуль учитывает только при расширении 
макросов: (\w и т.п.), я попробую провентилировать вопрос. 


------- Comment #5 From 2007-03-14 12:33:13 -------
reassign
------- Comment #6 From 2007-03-14 20:50:50 -------
В документации по re нигде не сказано, что LOCALE влияет на диапазоны вида
[а-я].
Более того, опыт показывает, что дмапазон _всегда_ строится по _кодам_
символов,
а не по LOCALE, которое влияет только на \w и пободных ему.

Так что это, увы, фича. Видимо, предполагается, что конструкции вида [ж-х] в
real life бессмысленны, множества типа гласные/согласные лучше всё-таки
задавать
перечислением, а иметь возможность работать с _кодом_ символа в различных
кодировках тоже хочется.

Предлагаю багу закрыть.
------- Comment #7 From 2008-02-15 22:53:07 -------
re
------- Comment #8 From 2008-02-15 22:53:36 -------
worksforme