Python: ошибка в re (регулярное выражение)? Или помогите мне понять, чего мне не хватает

Питон 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" заменены.

Вы случайно передаете re.I в качестве параметра count. Вместо этого используйте именованный аргумент: flags=re.I. См. документацию для справки.

wjandrea 16.03.2024 04:24

Это отвечает на ваш вопрос: Python re.sub с флагом не заменяет все вхождения

Nick 16.03.2024 04:25

Кстати, я сам уловил проблему, заметив, что сопоставление вообще не учитывает регистр, что заставило меня подумать, что re.I был отвлекающим маневром.

wjandrea 16.03.2024 04:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция 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)

Блин. Я чувствую себя таким глупым. Мне нужен полноценный сон.

Normadize 16.03.2024 04:24

Этот вопрос задавался много раз. Вы должны голосовать за то, чтобы закрыть вопрос как дурак, а не отвечать.

Nick 16.03.2024 04:26

@Ник Хорошо. Спасибо, что дал мне знать. Прошу прощения за то, что не знаю всех вопросов, на которые ранее были даны ответы.

Nick ODell 16.03.2024 04:30

Достаточно справедливо, и поэтому я не голосую против, а просто вношу предложения.

Nick 16.03.2024 04:31

Другие вопросы по теме