Подтвердить что ты не робот

Как указать диапазон символов Unicode

Как указать диапазон символов Юникода от ' ' (пробел) до \u00D7FF?

У меня есть регулярное выражение типа r'[\u0020-\u00D7FF]', и оно не будет компилироваться, говоря, что это плохой диапазон. Я новичок в регулярных выражениях Unicode, поэтому раньше у меня не было этой проблемы.

Есть ли способ сделать это компиляцию или регулярное выражение, которое я забыл или еще не узнал?

4b9b3361

Ответ 1

Синтаксис вашего юникодного диапазона не будет делать то, что вы ожидаете.

  • Необработанная строка r'' предотвращает синтаксический анализ экранов \u, и механизм regex этого не сделает. Единственный диапазон в этом наборе: [0-\]:

    >>> re.compile(r'[\u0020-\u00d7ff]', re.DEBUG)
    in
      literal 117
      literal 48
      literal 48
      literal 50
      range (48, 117)
      literal 48
      literal 48
      literal 100
      literal 55
      literal 102
      literal 102
    
  • Как сделать его литералом Unicode вызывает синтаксический анализ \u при оставлении других обратных косых черт (хотя это и не проблема), но ведущие нули являются беспорядочными это вверх. Синтаксис \uxxxx или \Uxxxxxxxx, поэтому он анализируется как "\u00d7, f, f".

    >>> re.compile(ur'[\u0020-\u00d7ff]', re.DEBUG)
    in
      range (32, 215)
      literal 102
      literal 102
    
  • Удаление ведущих нулей или переключение на \U0000d7ff исправит его:

    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG)
    in
      range (32, 55295)
    

Ответ 2

Если вы используете Python 2.x, вы должны убедиться, что вы указываете строку юникода (с помощью u '' или встроенного в Unicode):

>>> r = re.compile(u'[\u0020-\uD7FF]')
>>> r.search(u'foo \uD7F0 bar')
<_sre.SRE_Match object at 0xb7084950>
r.search(u' ')
<_sre.SRE_Match object at 0xb7084b48>

Используя исходные строки (как вы, с r ''), вы получаете строку (ascii), составленную "backstroke" + буквой "u" плюс число 0 плюс...