Юникод преобразование регистра - PullRequest
1 голос
/ 21 августа 2010

Мне дают один символ или строку, и я использую Python.

Как узнать, есть ли у конкретного символа строчный эквивалент в соответствии со стандартами (сопоставлениями стандартных и особых случаев), предложенными Unicode?

А как мне узнать, содержит ли строка один или несколько символов, которые имеют строчный эквивалент в соответствии со стандартами (сопоставлениями в стандартном и особом случаях), предложенными Unicode?

Ответы [ 2 ]

5 голосов
/ 21 августа 2010
def haslower(unicodechar):
    return unicodechar != unicodechar.lower()

def anylower(unicodestring):
    return any(haslower(c) for c in unicodestring)

Это будет работать корректно только в той степени, в которой используемая версия Python правильно реализовала метод .lower() для стандартов Юникода, конечно. Кроме того, я предполагаю, что вы не считаете, например, u'a', что «иметь строчный эквивалент» (он, конечно, имеет прописные буквы ). Если вы имеете в виду что-то другое, рассмотрите

def changescase(uc):
    return uc != uc.lower() or uc != uc.upper()

(я переименовал аргумент в uc, чтобы избежать чрезмерной длины строки ;-) - если это то, что вы хотите, я рекомендую , а не , называя функцию в терминах "эквивалента в нижнем регистре", как наверняка запутает читателей / сопровождающих вашего кода! -)

1 голос
/ 21 августа 2010

@ Альберт, Вы, кажется, слишком озабочены мелочами преобразования дел, когда вы еще не разобрались (и не объяснили ответчикам), что вы действительно хотите сделать.

=== Вашпредыдущая попытка объяснения (в комментарии к моему ответу на этот вопрос ) ===

@ Джон: Ну, на самом деле я делаю API для своего веб-сервиса.Мой веб-сервис принимает ключ, который отображается на конкретную запись в моей базе данных.Ключ чувствителен к регистру, и ключ может состоять из любого символа Unicode.Поэтому, чтобы нормализовать весь ввод, я преобразую все ключевые запросы в строчные (если они имеют прописные эквиваленты).Следствием этого является то, что когда я создаю ключи записи (которые могут настраивать мои пользователи), Я не могу принять любой символ в верхнем регистре, который может быть преобразован в эквивалент в нижнем регистре с помощью функции toLower ().Поэтому я пытаюсь сделать фильтр для этого.Любые предложения?

=== и мой ответный комментарий ===

@ Альберт: Если ваши ключи чувствительны к регистру, почему вы их нормализуете ???"ключи записи, которые пользователи могут настраивать" означает что ???"любой символ Unicode" против "не может принимать символы верхнего регистра" ??? Чтобы ответить на ваш вопрос буквально: похоже, вы не можете принять символ c, когда c.lower ()! = C, что означает, что вы не можете принять любой ключ, если key.lower ()! = Key. Я думаю, что вы должны начать НОВЫЙ ВОПРОС, объясняя точно, что вы пытаетесь сделать, с примерами.

... и вы, конечно, задали новый вопрос (фактически 2 из них), но выничего не объяснилЭтот «новый» вопрос настолько нов, что ответ @Alex Martelli, по сути, такой же, как и мой комментарий, выделенный выше.

Я думаю, что вы должны начать НОВЫЙ ВОПРОС, с новым содержанием , объясняяименно то, что вы пытаетесь сделать, с примерами.

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