Замена regex только, когда это не соответствует другому regex (Python)

У меня была эта проблема сегодня после обновления до ядра Ubuntu, и я попробовал множество решений выше. Однако единственное, что сработало (Ubuntu 16.04.6 LTS), - это удалить (или переименовать) папку: / var / lib / docker

Обратите внимание, этот удалит все ваши образы докеров, контейнеры, тома и т. д. Итак, поймите последствия до применения или создания резервной копии!

Подробнее здесь: https://github.com/docker/for-linux/issues/ 162

5
задан So8res 20 May 2009 в 16:45
поделиться

4 ответа

Вы можете дать функцию 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)
4
ответ дан 13 December 2019 в 19:34
поделиться

Использование утверждения отрицательного просмотра вперед / назад

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 }

Итак, мы ищем {без каких-либо других {вокруг него, за которым следуют некоторые символы, за которыми следует} без каких-либо других} вокруг него.

Используя отрицательное утверждение с прогнозом вперед / назад, мы его уплотняем вплоть до одного регулярного выражения, которое будет успешно соответствовать только одиночным {} в любом месте строки.

Также обратите внимание, что * является жадным оператором. Он будет соответствовать настолько, насколько это возможно.

6
ответ дан 13 December 2019 в 19:34
поделиться

Вы можете заменить все экземпляры {} своей заменяющей строкой (которая будет включать {{}}), а затем заменить {{}} их обратной ссылкой на себя (перезапись первой замены исходными данными) - тогда изменились бы только экземпляры {}.

1
ответ дан 13 December 2019 в 19:34
поделиться

Мне кажется, что это неоптимально для сопоставления с двумя разными регулярными выражениями, когда на самом деле вы ищете один шаблон. Для иллюстрации:

import re
foo = "{{this}}"
bar = "{that}"
re.match("\{[^\{].*[^\}]\}", foo)  # gives you nothing
re.match("\{[^\{].*[^\}]\}", bar)  # gives you a match object

Итак, это действительно ваше регулярное выражение, которое могло бы быть немного точнее.

0
ответ дан 13 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: