Как извлечь предыдущие значения из соответствующей строки?

#python #python-3.x #regex

#python #python-3.x #регулярное выражение

Вопрос:

Идея состоит в том, чтобы удалить все, начиная с record { закрытия } каждой my_id_* используемой в качестве переменной.

Я использую этот инструмент для проверки выражения: https://pythex.org /

У нас есть следующий файл:

 record {
    record {
        id my_id_1
        my_name_1
    }

    record {
        id my_id_2
        my_name_2
    }

    record {
        id my_id_3
        my_name_3
    }
}
 

И мы хотим, чтобы вывод был таким:

Удаление my_id_3

 record {
    record {
        id my_id_1
        my_name_1
    }

    record {
        id my_id_2
        my_name_2
    }
}
 

Мое фактическое регулярное выражение находит значения от my_id_* первого до первого } , но я не могу получить предыдущее record {

Фактическое регулярное выражение:

 (my_id_3.*?})
 

Я попытался проиндексировать это во втором выражении регулярного выражения, чтобы получить правильную record { запись, но ничего не получается:

Вторая попытка:

 record {(?!=/s.*)
 

Комментарии:

1. Вы можете добавить record {s к своему коду поиска записей. Это будет соответствовать record { и любым конечным пробелам. Полное регулярное record {s my_id_3(s w s ) } выражение работает для меня.

2. @Thymen Я допустил ошибку, перед идентификатором установлено слово, которое нарушает это регулярное выражение. ОБНОВЛЕН ФАЙЛ ПРИМЕРА

Ответ №1:

Это работает с параметром ‘dotall’, установленным на https://pythex.org

record {[^}{]*(my_id_3.*?})

Комментарии:

1. Этот не фиксирует record { , он выдает тот же результат соответствия, что (my_id_3.*?}) и я, допустил ошибку, перед идентификатором установлено слово, которое нарушает это регулярное выражение. ОБНОВЛЕН ФАЙЛ ПРИМЕРА

2. похоже, что изменение захвата, перемещение круглых скобок решило проблему в этом: (record {[^}{]*my_id_1.*?})

Ответ №2:

похоже, это работает после обновления содержимого файла.

(record {[^}{]*my_id_1.*?})

(record {[^}{]*my_id_2.*?})

(record {[^}{]*my_id_3.*?})

Ответ №3:

Вы можете использовать отрицаемый символьный класс [^ , исключающий сопоставление { , и } в начале, и в конце шаблона.

Обратите внимание, что вы можете опустить группу захвата () вокруг шаблона и что вам не нужно экранировать фигурные скобки внутри символьного класса.

 brecord {[^{}]*my_id_1[^{}]*}
 

Демонстрация регулярных выражений

Если вы хотите удалить все 3 части сразу, вы можете использовать символьный класс [123] , в котором перечислены все числа.

 brecord {[^{}]*my_id_[123][^{}]*}
 

Демонстрация регулярных выражений

Ответ №4:

Вот так. пробел внутри []

 (n[ ]*record {n[ ]*my_id_3.*?})
 

Комментарии:

1. Я допустил ошибку, перед идентификатором установлено слово, которое нарушает это регулярное выражение. ОБНОВЛЕН ФАЙЛ ПРИМЕРА

2. Пожалуйста, не предлагайте использовать регулярные выражения для анализа вложенного содержимого.