Проблема с:
(?!\d{2},).*
В том, что как только он находит позицию, в которой следующие символы не исправляются, \d{2},
так, что утверждение отрицательного просмотра вперед завершается успешно, тогда .*
соответствует остальной части input, и вы в конечном итоге замените всю строку, предположительно, на ''.
Таким образом, вы действительно можете позволить себе безопасно сопоставить только один символ для замены с этим методом утверждения отрицательного looakahead:
(?!\d{2},).
Но что происходит сейчас, когда текущая позиция сканирования механизма регулярных выражений продвинулась вперед и теперь находится внутри строки, таким образом:
... [1 2,3 ....
^
current position between the 1 and the 2
Проблема теперь в том, что утверждение отрицательного просмотра вперед успешно, потому что нет два цифр, но только одна di git следующая, поэтому 2
будет заменен. Итак, если вы собираетесь использовать свою методологию, вам придется ослабить утверждение отрицательного просмотра вперед до:
(?!,?\d{1,2},?).
In Python:
>>> re.sub(r'(?!,?\d{1,2},?).', '', '{"data":[12,23,34,45,56,67,78,89,90,10], "something": {"key":"value"}}')
'12,23,34,45,56,67,78,89,90,10'
Но пока регулярное выражение работает для этого Speci c input, он был вынужден ослабить утверждение до такой степени, что оно также могло бы принимать одинарные git числа:
>>> re.sub(r'(?!,?\d{1,2},?).', '', '{"data":[1,3,4,5,6,7,8,9,0,0], "something": {"key":"value"}}')
'1,3,4,5,6,7,8,9,0,0'
Итак, если вы настаиваете на использовании регулярного выражения, Альтернативный подход к замене того, чего вы не хотите, - это поиск того, что вам действительно нужно. Например:
>>> re.findall(r'(?<=\[)\d{2}(?:,\d{2})*(?=])', '{"data":[12,23,34,45,56,67,78,89,90,10], "something": {"key":"value"}}')
['12,23,34,45,56,67,78,89,90,10']
В Python функция findall
возвращает список всех найденных совпадений (в этом случае длина списка равна единице).