Какой самый простой способ сделать замену строк без учета регистра в Python?
python
string
case-insensitive
Адам Эрнст
источник
источник
'hippo'
, но было бы полезно, если бы значение для замены было передано в функцию, так что это действительно более хороший пример, чем все остальное.re.escape
стрелять, есть еще одна ловушка, которую этот ответ не может избежать, отмеченная в stackoverflow.com/a/15831118/1709587 : посколькуre.sub
процессы экранируют последовательности, как отмечено в docs.python.org/library/re.html#re .sub , вам нужно либо избежать обратной косой черты в замещающей строке, либо использовать лямбду.источник
re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
re.sub
этот флаг поддерживается только с Python 2.7.В одной строке:
Или используйте необязательный аргумент «flags»:
источник
Продолжая ответ bFloch, эта функция изменит не одно, а все вхождения старого на новое - без учета регистра.
источник
Как говорит Блэр Конрад, string.replace не поддерживает это.
Используйте регулярное выражение
re.sub
, но не забудьте сначала экранировать строку замены. Обратите внимание, что в 2.6 нет опции flagsre.sub
, поэтому вам придется использовать встроенный модификатор'(?i)'
(или RE-объект, см. Ответ Блэра Конрада). Кроме того, другая ловушка заключается в том, что sub будет обрабатывать экранирование обратной косой черты в тексте замены, если задана строка. Чтобы избежать этого, можно вместо этого перейти в лямбду.Вот функция:
источник
Эта функция использует как
str.replace()
иre.findall()
функцию. Он заменит все вхожденияpattern
вstring
безrepl
учета регистра.источник
Это не требует RegularExp
источник
Интересное наблюдение о деталях синтаксиса и опциях:
Python 3.7.2 (tags / v3.7.2: 9a3ffc0492, 23 декабря 2018, 23:09:28) [MSC v.1916 64 бит (AMD64)] на win32
«Массовый Массовый»
«TREEROOT низовой TREerOot»
«Массовый Массовый»
«TREEROOT низовой TREerOot»
Таким образом, префикс (? I) в выражении соответствия или добавление «flags = re.I» в качестве четвертого аргумента приведет к нечувствительному к регистру соответствию. НО, использование только «re.I» в качестве четвертого аргумента не приводит к нечувствительному к регистру соответствию.
Для сравнения,
['TREEROOT', 'treeroot', 'TREerOot']
[ 'Treeroot']
источник
У меня было \ t преобразование в escape-последовательности (прокрутка немного вниз), поэтому я заметил, что re.sub конвертирует экранированные символы с обратной косой чертой в escape-последовательности.
Чтобы предотвратить это, я написал следующее:
Заменить без учета регистра.
Кроме того, если вы хотите заменить его на escape-символы, как и в других ответах, которые получают специальные символы bashslash, преобразованные в escape-последовательности, просто декодируйте строку find и или заменяйте строку. В Python 3 может потребоваться что-то вроде .decode ("unicode_escape") # python3
Проверено в Python 2.7.8
Надеюсь, это поможет.
источник
Я никогда не публиковал ответ, и эта ветка действительно старая, но я придумал другое решение и решил, что могу получить ваш ответ. Я не опытный программист на Python, поэтому, если у него есть явные недостатки, пожалуйста, укажите на них, поскольку он хорошо изучен: )
источник