Группирование шаблона поиска за кадром вместе с соответствующим шаблоном поиска регулярных выражений для замены в целом - PullRequest
0 голосов
/ 05 сентября 2018

Я должен найти и заменить шаблон следующим условием: если в строке обнаружена строка «y = 2» и если ей предшествует или не предшествует «x =», то следует заменить соответствующую строку «y = 2» на «x = 1 y = 2». Я пытаюсь со следующим

line="hello x=7 y=2"
m = re.search(r"((?<=x=\d\s)|(?<!x=\d\s))y=2", line)
if m:
    s = "x=1 " + m.group(0)
    line = re.sub(m.group(0), s, line)
    print line

Я получаю вывод как привет x = 7 x = 1 год = 2 , что отличается от моего ожидаемого результата: привет x = 1 год = 2

Как получить весь шаблон, включая выражение lookbehind, в виде совпадающей строки? Это решит мою проблему.

m.group(0) always print y=1, and m.group(1) prints nothing

Я хочу, чтобы в этой строке была вся строка "x = 7 y = 1", чтобы подстановка работала правильно

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я не думаю, что вам нужен шаблон заглядывания для этого. Вся работа заключается в замене y=2 или x=\d y=2 на x=1 y=2, верно?

line="hello x=7 y=2"
re.sub(r'(x=\d\s)?y=2', 'x=1 y=2', line) 
0 голосов
/ 05 сентября 2018

Итак, в принципе, если строка имеет y=2, заменить или добавить предшествующее определение x=? Если это так, я предлагаю вам изменить свой алгоритм так:

  1. Если поиск y=2 верен, то
  2. Если поиск x=[0-9] имеет значение true, заменить на x=1;
  3. Иначе, замените y=2 на x=1 y=2 (Для оптимизации вы можете сохранить и использовать исходный результат поиска для y=2.)
...