Как игнорировать регистр в python
Игнорировать регистр в строках Python [дубликат]
этот вопрос уже есть ответ здесь:
каков самый простой способ сравнить строки в Python, игнорируя регистр?
конечно, можно сделать (str1.lower ()
Я думаю,что ищу эквивалент stricmp () C.
[еще один запрошенный контекст, поэтому я продемонстрирую с тривиальным примером:]
теперь вы хотите сделать то же самое, но игнорируйте случай (давайте упростим и скажем все строки являются ascii, поэтому проблемы локали можно игнорировать). Вы можете сделать список.сортировка (ключ=лямбда s: s.ниже ()), но затем вы вызываете два новых распределения на сравнение, плюс нагрузка мусоросборника с дублированным (опускает) струны. Каждый такой шум управления памятью на порядок медленнее, чем простое сравнение строк.
теперь, с функцией stricmp () на месте, вы делаете: theList.сортировать (cmp=stricmp) и это так же быстро и память-это список.род.)( Вы снова счастливы.
проблема заключается в том, что любое сравнение на основе Python без учета регистра включает неявную строку дублирование, поэтому я ожидал найти сравнение на основе C (возможно, в строке модуля).
Не могу найти ничего подобного, поэтому вопрос здесь. (Надеюсь, это проясняет вопрос).
16 ответов
в ответ на Ваше разъяснение.
можно использовать ctypes для выполнения функции c «strcasecmp». Ctypes входит в Python 2.5. Он предоставляет возможность вызывать dll и общие библиотеки, такие как libc. Вот краткий пример (Python в Linux; см. ссылку для справки Win32):
может также хотеть ссылаться документация strcasecmp
Не уверен, что это быстрее или медленнее (не тестировалось), но это способ использовать функцию C для сравнения строк без учета регистра.
Код ActiveState-Рецепт 194371: Строки Без Учета Регистра является рецептом для создания класса String без учета регистра. Это может быть немного больше kill для чего-то быстрого, но может предоставить вам общий способ обработки нечувствительных к регистру строк, Если вы планируете использовать их часто.
вот тест, показывающий, что использование str.lower быстрее, чем предлагаемый метод принятого ответа ( libc.strcasecmp ):
типичные времена на моей машине:
NB: lower() строковый метод также имеет преимущество быть зависимым от локали. Что-то, что вы, вероятно, не получите правильно при написании собственного «оптимизированного» решения. Тем не менее, из-за ошибок и отсутствующих функций в Python такое сравнение может дать неправильные результаты в контексте unicode.
ваш вопрос подразумевает, что вам не нужен Unicode. Попробуйте следующий фрагмент кода, если он работает для вас, вы сделали:
пояснение: в случае, если это не очевидно на первый взгляд, язык.strcoll кажется функцией, которая вам нужна, избегая str.ниже или ниже.strxfrm «дублирует» строки.
Если это действительно чрезвычайно важный, критичный для производительности раздел кода, то я рекомендую написать функцию на C и вызвать ее из вашего кода Python, так как это позволит вам выполнить действительно эффективный поиск без учета регистра. Подробнее о написании модулей расширения C можно найти здесь:https://docs.python.org/extending/extending.html
Я не могу найти другой встроенный способ выполнения сравнения без учета регистра: рецепт кулинарной книги python использует lower ().
однако вы должны быть осторожны при использовании ниже Для сравнения из-за турецкий я проблема. К сожалению, обработка Python для турецкого языка не очень хороша. I преобразуется в I, но я не преобразуется в I. Я обращен в я, но я не обращен в Я.
нет встроенный эквивалентную функцию.
Если вы не работаете с очень длинными строками (так долго, что может вызвать проблему с памятью, если дублируется), то я бы оставил его простым и использовать
этот вопрос задает 2 очень разные вещи:
поскольку #1 уже получил очень хороший ответ (т. е.: str1.lower ()
используйте эту функцию только тогда, когда это имеет смысл, так как во многих случаях техника нижнего регистра будет превосходный.
Я работаю только со строками ascii, я не уверен, как это будет вести себя с unicode.
когда что-то не поддерживается хорошо в стандартной библиотеке, я всегда ищу пакет PyPI. С виртуализацией и повсеместностью современных дистрибутивов Linux я больше не избегаю расширений Python. PyICU, кажется, подходит для счета:https://stackoverflow.com/a/1098160/3461
теперь есть также опция, которая является чистым python. Это хорошо проверено:https://github.com/jtauber/pyuca
старый ответ:
Мне нравится решение регулярного выражения. Вот функция, которую вы можете скопировать и вставить в любую функцию, благодаря поддержке блочной структуры python.
поскольку я использовал match вместо search, мне не нужно было добавлять курсор ( ^ ) в регулярное выражение.
Примечание: это только проверяет равенство, которое иногда необходимо. Я бы не стал заходить так далеко, чтобы сказать, что мне нравится.
вот как вы это сделаете с re:
рекомендуемая идиома для сортировки списков значений с использованием дорогостоящих для вычисления ключей относится к так называемому «оформленному шаблону». Он состоит просто в создании списка (ключа, значения) кортежей из исходного списка и сортировке этого списка. Тогда тривиально исключить ключи и получить список отсортированных значений:
или если вы любите ОДН-вкладыши:
Если вы действительно беспокоитесь о стоимости вызова lower(), вы можете просто сохранить кортежи (пониженная строка, оригинальная строка) везде. Кортежи-самый дешевый вид контейнеров в Python, они также хэшируются, поэтому их можно использовать как ключи словаря, элементы набора и т. д.
для случайных или даже повторяющихся сравнений несколько дополнительных строковых объектов не должны иметь значения, пока это не произойдет в самом внутреннем цикле вашего основного кода или у вас недостаточно данных, чтобы фактически заметить влияние производительности. Смотрите, если вы делаете: делать вещи «глупым» способом намного менее глупо, если вы также делаете это меньше.
Если вы серьезно хотите продолжать сравнивать много и много текста без учета регистра, вы можете каким-то образом сохранить строчные версии строк под рукой чтобы избежать завершения и повторного создания или нормализации всего набора данных в нижнем регистре. Это, конечно, зависит от размера набора данных. Если есть относительно мало игл и большой стог сена, замена игл скомпилированными объектами regexp является одним из решений. Трудно сказать, не видя конкретного примера.
обратите внимание, что этот метод может использоваться не только для обработки верхнего / нижнего регистра, но и для других типов сортировки, таких как сортировка по локали, или сортировка заголовков в стиле библиотеки, которая игнорирует ведущие статьи и нормализует данные перед сортировкой.
более интересно, данное руководство сравнивает использование библиотеки ctypes против написания внешнего модуля C (ctype довольно-существенно медленнее, чем расширение C).
Как сделать ввод не чувствительным к регистру Python [duplicate]
Я согласен с ответом от zacherates.
Но вы можете сделать вызов intern () в ваших нелиберальных строках.
Из примера zacherates:
Если вы ставите нелитеральное равенство строки, это правда
10 ответов
Предполагая строки ASCII:
Если у вас есть списки со строками, и вы хотите сравнить строки в другом списке с учетом регистра. Вот мое решение.
После этого вы можете легко выполнить сравнение строк.
Я использовал это, чтобы выполнить что-то более полезное для сравнения двух строк:
Он хорошо работает с акцентами
Однако он не работает с символами Unicode без учета регистра. Спасибо @Rhymoid за указание на то, что, как я понял, ему нужен точный символ, так как это правда. Выход следующий:
Обычный подход состоит в том, чтобы заглавные строки или нижний регистр для поиска и сравнений. Например:
В разделе 3.13 стандарта Unicode определены алгоритмы для несогласованного сопоставления.
X.casefold() == Y.casefold() в Python 3 реализует «стандартное сопоставление без содержания» (D144).
Casefolding не сохраняет нормализацию строк во всех экземплярах, и поэтому необходимо выполнить нормализацию ( ‘å’ vs. ‘å’ ). D145 вводит «каноническое несоответствие без содержания»:
NFD() вызывается дважды для очень редких случаев кросс, связанных с символом U + 0345.
Однако, поскольку из Python 3 все три формы будут разрешены для ς, и вызов lower () для обеих строк будет работать правильно:
Итак, если вы заботитесь о краевых случаях, таких как три сигмы на греческом языке, используйте Python 3.
(Для справки, Python 2.7.3 и Python 3.3.0b1 показаны в распечатках интерпретатора выше.)
Сравнение строки в нечувствительном к регистру образом кажется чем-то тривиальным, но это не так. Я буду использовать Python 3, так как Python 2 недостаточно развит здесь.
Это потому, что они на самом деле
. Чтобы закончить, здесь это выражается в функциях:
Игнорировать регистр в строках Python
Какой самый простой способ сравнить строки в Python, игнорируя регистр?
Конечно, это можно сделать (str1.lower ()
Вот тест, показывающий, что использование str.lower быстрее, чем предложенный метод принятого ответа ( libc.strcasecmp ):
типичные времена на моей машине:
Таким образом, версия с str.lower является не только самой быстрой на сегодняшний день, но и самой переносимой и Pythonic из всех предложенных здесь решений Я не описывал использование памяти, но оригинальный плакат до сих пор не дал убедительной причины беспокоиться об этом. Кроме того, кто сказал, что вызов в модуль libc не дублирует строки?
NB. Строковый метод lower() также имеет то преимущество, что он зависит от локали. Что-то, что вы, вероятно, не получите, когда пишете свое собственное «оптимизированное» решение. Тем не менее, из-за ошибок и отсутствующих функций в Python, такое сравнение может дать неверные результаты в контексте юникода.
Если это действительно чрезвычайно важный, критичный к производительности раздел кода, то я рекомендую написать функцию на C и вызывать ее из кода Python, поскольку это позволит вам выполнять действительно эффективный поиск без учета регистра. Подробности написания модулей расширения C можно найти здесь: https://docs.python.org/extending/extending.html
Ваш вопрос подразумевает, что вам не нужен Unicode. Попробуйте следующий фрагмент кода; если это работает для вас, вы сделали:
Пояснение: в случае, если это не очевидно с первого взгляда, locale.strcoll, кажется, является функцией, которая вам нужна, избегая str.lower или locale.strxfrm «дубликаты» строк.
Я не могу найти какой-либо другой встроенный способ сравнения без учета регистра: рецепт кулинарной книги python использует lower ().
Там нет встроенного аналога той функции, которую вы хотите.
Если вы не работаете с очень длинными строками (такими длинными, которые могут вызвать проблемы с памятью при дублировании), я бы оставил их простыми и использовал
Ты будешь в порядке
Этот вопрос задает 2 очень разные вещи:
Поскольку # 1 уже получен очень хороший ответ (т.е. str1.lower ()
Когда в стандартной библиотеке что-то не очень хорошо поддерживается, я всегда ищу пакет PyPI. Благодаря виртуализации и повсеместному распространению современных дистрибутивов Linux я больше не избегаю расширений Python. PyICU, кажется, отвечает всем требованиям: https://stackoverflow.com/a/1098160/3461
Там теперь также есть опция, которая является чистым питоном. Это хорошо проверено: https://github.com/jtauber/pyuca
Старый ответ:
Мне нравится решение с регулярными выражениями. Вот функция, которую вы можете скопировать и вставить в любую функцию, благодаря поддержке блочной структуры python.
Поскольку я использовал поиск вместо поиска, мне не нужно было добавлять каретку (^) к регулярному выражению.
Примечание: Это проверяет только равенство, что иногда является необходимым. Я бы тоже не сказал, что мне это нравится.
Рекомендуемая идиома для сортировки списков значений с использованием дорогих для вычисления ключей заключается в так называемом «декорированном шаблоне». Он состоит просто в создании списка (ключ, значение) кортежей из исходного списка и сортировке этого списка. Затем тривиально удалить ключи и получить список отсортированных значений:
Или если вы любите однострочники:
Если вы действительно беспокоитесь о стоимости вызова lower (), вы можете просто хранить кортежи (пониженная строка, исходная строка) везде. Кортежи являются самым дешевым видом контейнеров в Python, они также могут быть хэшируемыми, поэтому их можно использовать в качестве ключей словаря, членов набора и т.д.
Вот как бы вы сделали это с помощью re:
Для случайных или даже повторных сравнений несколько дополнительных строковых объектов не должны иметь значения, если это не произойдет в самом внутреннем цикле вашего основного кода или у вас недостаточно данных, чтобы реально заметить влияние на производительность. Посмотрите, если вы это сделаете: делать что-то «глупо» гораздо менее глупо, если вы тоже делаете это меньше.
Если вы серьезно хотите продолжать сравнивать много и много текста без учета регистра, вы можете каким-то образом держать строчные версии строк под рукой, чтобы избежать финализации и повторного создания, или нормализовать весь набор данных в нижний регистр. Это, конечно, зависит от размера набора данных. Если имеется относительно немного игл и большой стог сена, замена игл скомпилированными объектами регулярного выражения является одним из решений. Если трудно сказать, не видя конкретного примера.
Обратите внимание, что этот метод можно использовать не только для обработки проблем верхнего/нижнего регистра, но и для других типов сортировки, таких как сортировка по конкретному языку или сортировка заголовков в «библиотечном стиле», которая игнорирует ведущие статьи и иным образом нормализует данные перед сортировкой.
Что еще более интересно, Это руководство сравнивает использование библиотеки ctypes с написанием внешнего модуля C (ctype значительно медленнее, чем расширение C).
Игнорировать регистр в строках Python
Какой самый простой способ сравнить строки в Python, игнорируя регистр?
16 ответов
Это все равно, чтобы игнорировать регистр в SQL сервера заменить, так: Declare @replaceword = ‘test’ REPLACE(@var,@replaceword,’‘ + @replaceword + ‘‘) Итак, если @var было ‘Test test’ Это возвращение мира ‘Test test‘
Вот тест, показывающий, что использование str.lower быстрее, чем предложенный метод принятого ответа ( libc.strcasecmp ):
типичные времена на моей машине:
Таким образом, версия с str.lower является не только самой быстрой на сегодняшний день, но и самой портативной и питонической из всех предложенных здесь решений. Я не профилировал использование памяти, но оригинальный плакат до сих пор не дал убедительной причины беспокоиться об этом. Кроме того, кто сказал, что вызов модуля libc не дублирует никаких строк?
NB: строковый метод lower() также имеет то преимущество, что он зависит от locale. Что-то, что вы, вероятно, не получите правильно, когда будете писать свое собственное решение «optimised». Тем не менее, из-за ошибок и отсутствующих функций в Python такое сравнение может дать вам неправильные результаты в контексте unicode.
Ваш вопрос подразумевает, что вам не нужен Unicode. Попробуйте следующий фрагмент кода; если он работает для вас, вы закончили:
Пояснение: если это не очевидно на первый взгляд, то locale.strcoll кажется вам нужной функцией, избегая строк str.lower или locale.strxfrm «duplicate».
Если это действительно чрезвычайно важный, критичный для производительности раздел кода, то я рекомендую написать функцию в C и вызвать ее из вашего кода Python, так как это позволит вам выполнить действительно эффективный поиск без учета регистра. Сведения о написании модулей C расширения можно найти здесь: https://docs.python.org/продления/продления.html
Нельзя заставить регулярные выражения python игнорировать регистр в строке unicode. mach = re.search(ur'(?P (? true Я хочу проверить, начинается ли строковый элемент в массиве с другой строки, игнорирующей верхний регистр, например LIKE % в MySQL.
Я не могу найти никакого другого встроенного способа сделать сравнение без учета регистра: рецепт поваренной книги python использует lower().
Там нет встроенного эквивалента этой функции, которую вы хотите.
Если вы не работаете с очень длинными строками (настолько длинными, что при дублировании могут возникнуть проблемы с памятью), то я бы сохранил их простыми и удобными
С тобой все будет в порядке
Когда что-то не поддерживается в стандартной библиотеке, я всегда ищу пакет PyPI. С виртуализацией и повсеместным распространением современных дистрибутивов Linux я больше не избегаю расширений Python. PyICU, кажется, подходит по всем статьям: https://stackoverflow.com/a/1098160/3461
Теперь есть также вариант, который является чистым python. Он хорошо протестирован: https://github.com/jtauber/pyuca
Старый ответ:
Мне нравится решение с регулярным выражением. Вот функция, которую вы можете скопировать и вставить в любую функцию, благодаря поддержке блочной структуры python.
Поскольку я использовал match вместо поиска, мне не нужно было добавлять каретку (^) в регулярное выражение.
Примечание: Это только проверяет равенство, что иногда и требуется. Я также не зашел бы так далеко, чтобы сказать, что мне это нравится.
Этот вопрос задает 2 очень разные вещи:
Поскольку на #1 уже был дан очень хороший ответ (т. е.: str1.lower() Поделиться trevorcroft 30 августа 2011 в 05:45
Рекомендуемая идиома для сортировки списков значений с помощью ключей expensive-to-compute относится к так называемому «decorated pattern». Он состоит просто в построении списка кортежей (ключ, значение) из исходного списка и сортировке этого списка. Тогда тривиально устранить ключи и получить список отсортированных значений:
Или, если вам нравятся однострочные:
Если вы действительно беспокоитесь о стоимости вызова lower(), вы можете просто хранить кортежи (пониженная строка, исходная строка) везде. Кортежи-это самый дешевый вид контейнеров в Python,они также хэшируются, поэтому их можно использовать в качестве ключей словаря, членов набора и т. д.
Вот как вы это сделаете с ре:
Вы можете перевести каждую строку в нижний регистр один раз-лениво только тогда, когда вам это нужно, или в качестве предварительного перехода к сортировке, если вы знаете, что будете сортировать всю коллекцию строк. Существует несколько способов привязать этот ключ сравнения к фактическим сортируемым данным, но эти методы должны быть рассмотрены в отдельном выпуске.
Обратите внимание, что этот метод может быть использован не только для обработки проблем верхнего/нижнего регистра, но и для других типов сортировки, таких как locale specific sorting или «Library-style» title sorting, которые игнорируют ведущие статьи и иным образом нормализуют данные перед сортировкой.
Для случайных или даже повторяющихся сравнений несколько дополнительных строковых объектов не должны иметь значения до тех пор, пока это не произойдет в самом внутреннем цикле вашего основного кода или у вас не будет достаточно данных, чтобы действительно заметить влияние производительности. Смотрите, если вы это делаете: делать что-то «stupid» образом гораздо менее глупо, если вы также делаете это меньше.
Если вы всерьез хотите продолжать сравнивать много-много текста без учета регистра, вы могли бы каким-то образом сохранить строчные версии строк под рукой, чтобы избежать завершения и повторного создания, или нормализовать весь набор данных в нижний регистр. Это, конечно, зависит от размера набора данных. Если есть относительно мало иголок и большой стог сена, замена иголок скомпилированными объектами регулярных выражений является одним из решений. Если это трудно сказать, не видя конкретного примера.
«How to write a Python Extension» кажется вполне приличным вступлением..
Более интересно, что это руководство сравнивает использование библиотеки ctypes с написанием внешнего модуля C (ctype довольно-существенно медленнее, чем расширение C).
Вы могли бы подкласс str и создать свой собственный нечувствительный к регистру строковый класс, но IMHO это было бы крайне неразумно и создало бы гораздо больше проблем, чем стоит.
В ответ на ваши разъяснения.
Вы можете использовать ctypes для выполнения функции c «strcasecmp». Ctypes входит в Python 2.5. Он обеспечивает возможность вызова dll и общих библиотек, таких как libc. Вот краткий пример (Python на Linux; см. ссылку для справки Win32):
возможно, вы также захотите обратиться к документации strcasecmp
Не совсем уверен, что это быстрее или медленнее (не тестировал), но это способ использовать функцию C для сравнения строк без учета регистра.
Похожие вопросы:
Можно ли сказать Perl игнорировать разрывы строк в строках? Мне нужны разрывы строк по причинам форматирования, так как у меня очень длинные строки. E.g. print hello world отдам hello world и нет.
Я использую System.Text.RegularExpressions.Regex.IsMatch(testString, regexPattern) для некоторых поисков в строках. Есть ли способ указать в строке regexPattern, что шаблон должен игнорировать.
У меня есть этот код для поиска в строке и замены некоторого текста другим текстом: Regex regexText = new Regex(textToReplace); retval = regexText.Replace(retval, Newtext); textToReplace может быть.
Это все равно, чтобы игнорировать регистр в SQL сервера заменить, так: Declare @replaceword = ‘test’ REPLACE(@var,@replaceword,’‘ + @replaceword + ‘‘) Итак, если @var было ‘Test.
Нельзя заставить регулярные выражения python игнорировать регистр в строке unicode. mach = re.search(ur'(?P (? true Я хочу проверить, начинается ли строковый элемент в массиве с другой строки, игнорирующей.
У меня есть две коллекции, которые содержат объекты моего пользовательского типа. Я сравниваю эти коллекции с помощью библиотеки FluentAssertions: Collection1.Should().BeEquivalentTo(Collection2);.
BestProg
Функции обрабатывающие регистр символов в строке
Содержание
Поиск на других ресурсах:
Функция capitalize() возвращает копию строки с первым символом в верхнем регистре, а другие символы в нижнем регистре.
Пример.
Функция введена в Python начиная из версии 3.3.
Пример.
Функция str.lower() преобразовывает символы в нижний регистр.
Пример.
Функция str.swapcase() возвращает копию строки с заглавными буквами, преобразованными в строчные и, наоборот, строчными преобразованными в заглавные. Общая форма вызова функции следующая:
Для данной функции нельзя утверждать, что нижеследующее выражение
будет всегда выполняться.
Пример.
Функция str.title() возвращает строку, в которой все слова начинаются с заглавной буквы. Другие символы в этих словах есть строчные. Общая форма использования функции следующая:
Функция имеет одну особенность. Символ ‘\» апострофа образовывает границу слова. В некоторых случаях это нежелательно. Во избежание этого недостатка нужно использовать регулярные выражения.
Пример.
Функция str.upper() позволяет получить копию строки в которой все символы находятся в верхнем регистре. Согласно документации Python общая форма функции следующая:
Конвертирование символов осуществляется только для символов имеющих верхний регистр. Это символы, которые включены в следующие категории: