Python isalpha () и скандик - PullRequest
       14

Python isalpha () и скандик

2 голосов
/ 26 ноября 2010

Есть ли способ заставить метод python isalpha понимать скандику? Я пробовал следующее:

>>> import locale
>>> locale.getlocale()
(None, None)
>>> 'thisistext'.isalpha()
True
>>> 'äöå'.isalpha()
False
>>> locale.setlocale(locale.LC_ALL,"")
'Finnish_Finland.1252'
>>> locale.getlocale()
('Finnish_Finland', '1252')
>>> 'äöå'.isalpha()
False

Ответы [ 3 ]

6 голосов
/ 26 ноября 2010

Самый простой способ - использовать строки в юникоде, если это нормально в вашем случае. Просто поставьте символ 'u' перед строкой:

>>> u'привіт'.isalpha()
True

Или эта строка как первая в файле:

# -*- coding: utf-8 -*-
3 голосов
/ 26 ноября 2010

Похоже, что ваша строковая константа НЕ является байтовой строкой, закодированной в cp1252, что необходимо для правильной работы str.isalpha в вашем регионе. Вы не говорите, в какой среде вы это напечатали. По тому, как locale отвечает, я могу сказать, что вы работаете в Windows; возможно, вы получаете UTF-8 из какой-то IDE или cp850 из окна командной строки.

То, что вы видите на экране, часто очень мало помогает в отладке. То, что вы видите, не то, что вы получили. Встроенная функция repr - это (или хочет быть) ваш друг. В ASCII он однозначно покажет, что у вас есть на самом деле. [Python 3: repr переименован ascii, и есть новый repr, который не тот, который вы хотите]

Попробуйте набрать s = "your string constant with 'accented' letters", а затем print repr(s) и отредактируйте свой вопрос, чтобы показать результаты (копировать / вставить, не печатать повторно). Также скажите, какую версию Python вы используете.

Еще один потенциальный приятель - `unicodedata.name '... см. Ниже.

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'Finnish')
'Finnish_Finland.1252'
>>> s = '\xe4\xf6\xe5'
>>> import unicodedata
>>> for c in s:
...     u = c.decode('1252')
...     print repr(c), repr(u), unicodedata.name(u, '<no name>')
...
'\xe4' u'\xe4' LATIN SMALL LETTER A WITH DIAERESIS
'\xf6' u'\xf6' LATIN SMALL LETTER O WITH DIAERESIS
'\xe5' u'\xe5' LATIN SMALL LETTER A WITH RING ABOVE
>>> s.isalpha()
True

Вы можете сравнить приведенные выше результаты с на этом графике .

1 голос
/ 29 января 2013

Вы также можете попробовать это:

>>> 'äöå'.decode('utf-8').isalpha()
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...