Был недавно прочитан на случайных и строковых сравнениях при игнорировании случая. Я читал, что стандарт MSDN должен использовать InvariantCulture и определенно избегать toLowercase. Однако casefold из того, что я прочитал, похож на более агрессивный toLowercase. Мой вопрос в том, следует ли использовать casefold в Python или есть ли более питоновский стандарт для использования? Кроме того, проходит ли чехол в Турцию?Должен ли я использовать фреймворк Python?
ответ
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')
Правда
1. Что объясняет 'casefold' [в документах] (https://docs.python.org/3/library/stdtypes.html#str.casefold). 2. Что означает «лучше» * в данном случае? 3. Что такое турецкий тест (и попробовали ли вы его запустить)? – jonrsharpe
@jonrsharpe Извините, это означало больше питонов, а также означало Турцию. Я просто хочу знать, что используют хорошие программисты, когда они хотят делать бесполезные сравнения в python. – FlyingLightning
@jonrsharpe - турецкий тест описан более подробно здесь http://stackoverflow.com/a/797043/135978 –