Питон 3.9.18. Если приведенный ниже базовый материал не является ошибкой в re, то почему я получаю разные результаты с тем, что должно быть эквивалентным кодом (ПРИМЕЧАНИЕ: я не ищу альтернативные способы достижения ожидаемого результата, у меня уже есть много таких альтернатив ):
import re
s = '{"merge":"true","from_cache":"true","html":"true","links":"false"}'
re.sub(r'"(true|false)"', r'\1', s, re.I)
'{"merge":true,"from_cache":true,"html":"true","links":"false"}'
^^^ обратите внимание, что были заменены только 1-й и 2-й "true", но вокруг 3-го и 4-го все еще отображаются кавычки ".
Тогда как следующее, которое должно быть эквивалентным ((?i) вместо re.I), работает как положено:
import re
s = '{"merge":"true","from_cache":"true","html":"true","links":"false"}'
re.sub(r'(?i)"(true|false)"', r'\1', s)
'{"merge":true,"from_cache":true,"html":true,"links":false}'
^^^ все экземпляры "true" и "false" заменены.
Это отвечает на ваш вопрос: Python re.sub с флагом не заменяет все вхождения
Кстати, я сам уловил проблему, заметив, что сопоставление вообще не учитывает регистр, что заставило меня подумать, что re.I был отвлекающим маневром.






Функция re.sub() имеет следующую сигнатуру:
Signature: re.sub(pattern, repl, string, count=0, flags=0)
Если вы укажете re.I в качестве четвертого аргумента, он будет интерпретировать его как аргумент подсчета.
При преобразовании в целое число re.I равно 2.
>>> print(int(re.I))
2
Таким образом, установка этого флага таким образом приводит к тому, что он делает только 2 замены.
Вместо этого я предлагаю использовать ключевое слово arg.
re.sub(r'"(true|false)"', r'\1', s, flags=re.I)
Блин. Я чувствую себя таким глупым. Мне нужен полноценный сон.
Этот вопрос задавался много раз. Вы должны голосовать за то, чтобы закрыть вопрос как дурак, а не отвечать.
@Ник Хорошо. Спасибо, что дал мне знать. Прошу прощения за то, что не знаю всех вопросов, на которые ранее были даны ответы.
Достаточно справедливо, и поэтому я не голосую против, а просто вношу предложения.
Вы случайно передаете
re.Iв качестве параметраcount. Вместо этого используйте именованный аргумент:flags=re.I. См. документацию для справки.