2016-10-31 7 views
3

Был недавно прочитан на случайных и строковых сравнениях при игнорировании случая. Я читал, что стандарт MSDN должен использовать InvariantCulture и определенно избегать toLowercase. Однако casefold из того, что я прочитал, похож на более агрессивный toLowercase. Мой вопрос в том, следует ли использовать casefold в Python или есть ли более питоновский стандарт для использования? Кроме того, проходит ли чехол в Турцию?Должен ли я использовать фреймворк Python?

+2

1. Что объясняет 'casefold' [в документах] (https://docs.python.org/3/library/stdtypes.html#str.casefold). 2. Что означает «лучше» * в данном случае? 3. Что такое турецкий тест (и попробовали ли вы его запустить)? – jonrsharpe

+0

@jonrsharpe Извините, это означало больше питонов, а также означало Турцию. Я просто хочу знать, что используют хорошие программисты, когда они хотят делать бесполезные сравнения в python. – FlyingLightning

+0

@jonrsharpe - турецкий тест описан более подробно здесь http://stackoverflow.com/a/797043/135978 –

ответ

4

1) В Python 3, casefold() следует использовать для реализации сопоставления строк без содержания.

С Python 3.0 строки сохраняются как Unicode. The Unicode Standard Chapter 3.13 определяет регистронезависимый в по умолчанию, соответствующий следующим образом:

Строка Х представляет собой без корпуса подходит для строки Y, если и только если:
toCasefold (Х) = toCasefold (Y)

Python's casefold() implements the Unicode's toCasefold(). Поэтому он должен использоваться для реализации сопоставления строк без содержания. Несмотря на то, что одних лишь случайных операций недостаточно, чтобы охватить некоторые угловые случаи и пройти Турцию (см. Пункт 3).

2) Начиная с версии Python 3.6, casefold() не может пройти тест Турции.

Для двух символов, прописные буквы I и пунктирная прописными I, the Unicode Standard defines two different casefolding mappings.

по умолчанию (для не-тюркских языков):
I → I (U + 0049 → U + 0069)
İ → I (U + 0130 → U + 0069 U + 0307)

альтернатива (для тюркских языков):
I → I (U + 0049 → U + 0131)
İ → i (U + 0130 → U + 0069)

Pythons casefold() может применять только картографирование по умолчанию и не выполняет Турцию. Например, турецкие слова «LİMANI» и «limanı» являются безвизовыми эквивалентами, но "LİMANI".casefold() == "limanı".casefold() возвращает False. Нет возможности включить альтернативное отображение.

3) Как сделать без учета регистра соответствия строки в Python 3.

The Unicode Standard Chapter 3.13 описывает несколько алгоритмов сопоставления без корпуса. Каноническое несоответствие , вероятно, подходит для большинства случаев использования. Этот алгоритм уже учитывает все угловые случаи. Нам нужно только добавить опцию для переключения между неюркской и тюркской фреймворками.

import unicodedata 

def normalize_NFD(string): 
    return unicodedata.normalize('NFD', string) 

def casefold_(string, include_special_i=False): 
    if include_special_i: 
     string = unicodedata.normalize('NFC', string) 
     string = string.replace('\u0049', '\u0131') 
     string = string.replace('\u0130', '\u0069') 
    return string.casefold() 

def casefold_NFD(string, include_special_i=False): 
    return normalize_NFD(casefold_(normalize_NFD(string), include_special_i)) 

def caseless_match(string1, string2, include_special_i=False): 
    return casefold_NFD(string1, include_special_i) == casefold_NFD(string2, include_special_i) 

casefold_() является оболочкой для языка Python casefold(). Если его параметр include_special_i установлен в True, то он применяет тюркское сопоставление, и если он установлен в False, используется сопоставление по умолчанию.

caseless_match() делает каноническое несоответствующее соответствие для string1 и string2.Если строки являются тюркскими словами, параметр include_special_i должен быть установлен в True.

Примеры:

caseless_match('LİMANI', 'limanı', include_special_i=True) Правда

caseless_match('LİMANI', 'limanı') Ложные

caseless_match('INTENSIVE', 'intensive', include_special_i=True) Ложные

caseless_match('INTENSIVE', 'intensive') Правда

 Смежные вопросы

  • Нет связанных вопросов^_^