У меня была эта проблема сегодня после обновления до ядра Ubuntu, и я попробовал множество решений выше. Однако единственное, что сработало (Ubuntu 16.04.6 LTS), - это удалить (или переименовать) папку: / var / lib / docker
Обратите внимание, этот удалит все ваши образы докеров, контейнеры, тома и т. д. Итак, поймите последствия до применения или создания резервной копии!
Подробнее здесь: https://github.com/docker/for-linux/issues/ 162
Вы можете дать функцию replace ( ссылка )
Но убедитесь, что первое регулярное выражение содержит второе. Это просто пример:
regex1 = re.compile('\{.*\}')
regex2 = re.compile('\{\{.*\}\}')
def replace(match):
match = match.group(0)
if regex2.match(match):
return match
return 'replacement'
regex1.sub(replace, data)
Использование утверждения отрицательного просмотра вперед / назад
pattern = re.compile( "(?<!\{)\{(?!\{).*?(?<!\})\}(?!\})" )
pattern.sub( "hello", input_string )
Утверждение отрицательного просмотра вперед / назад позволяет сравнивать с большей частью строки, но не считается использованной частью строки для матч. Существует также обычное утверждение «заглядывать вперед / назад», которое приведет к совпадению строки только в том случае, если строка ЕСТЬ после / предшествует данному шаблону.
Это немного сбивает с толку, вот оно по частям:
"(?<!\{)" #Not preceded by a {
"\{" #A {
"(?!\{)" #Not followed by a {
".*?" #Any character(s) (non-greedy)
"(?<!\})" #Not preceded by a } (in reference to the next character)
"\}" #A }
"(?!\})" #Not followed by a }
Итак, мы ищем {без каких-либо других {вокруг него, за которым следуют некоторые символы, за которыми следует} без каких-либо других} вокруг него.
Используя отрицательное утверждение с прогнозом вперед / назад, мы его уплотняем вплоть до одного регулярного выражения, которое будет успешно соответствовать только одиночным {} в любом месте строки.
Также обратите внимание, что * является жадным оператором. Он будет соответствовать настолько, насколько это возможно.
Вы можете заменить все экземпляры {} своей заменяющей строкой (которая будет включать {{}}), а затем заменить {{}} их обратной ссылкой на себя (перезапись первой замены исходными данными) - тогда изменились бы только экземпляры {}.
Мне кажется, что это неоптимально для сопоставления с двумя разными регулярными выражениями, когда на самом деле вы ищете один шаблон. Для иллюстрации:
import re
foo = "{{this}}"
bar = "{that}"
re.match("\{[^\{].*[^\}]\}", foo) # gives you nothing
re.match("\{[^\{].*[^\}]\}", bar) # gives you a match object
Итак, это действительно ваше регулярное выражение, которое могло бы быть немного точнее.