Как мне указать диапазон символов Unicode - PullRequest
22 голосов
/ 01 октября 2010

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

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

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

Ответы [ 2 ]

27 голосов
/ 01 октября 2010

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

  1. Необработанная строка r'' предотвращает анализ паролей \u, и механизм регулярных выражений этого не сделает. Единственный диапазон в этом наборе - [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
    
  2. Делая это Unicode-литералом вызывает \u синтаксический анализ, оставляя в одиночку другие обратные слеши (хотя это не проблема), но ведущие нули все портят. Синтаксис \uxxxx или \Uxxxxxxxx, поэтому он анализируется как "\u00d7, f, f".

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

    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG)
    in
      range (32, 55295)
    
5 голосов
/ 01 октября 2010

Если вы используете Python 2.x, вы должны убедиться, что вы указываете строку в кодировке Unicode (с 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 плюс ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...