Группа без захвата недоступна в выходных данных замены - PullRequest
0 голосов
/ 25 января 2019

Я хотел бы заменить несколько вертикальных полос (|) в строке новой строкой (\n).Однако существуют определенные условия, в которых он не должен заменяться, например строка обозначения цвета.

Рассмотрим следующий ввод:

Sample|text||new line|||cFFFFFF00|HEX|colorText in color|this will be inner new line|cFFFFFFFF|HEX|colorReset color. The following goes into the next line too:||hello world

Используя следующий вызов re.sub:

re.sub(r"(?:\|\|\w{9}\|HEX\|color.*?|([\|])?\|\w{9}\|HEX\|color)|(\|)", '\n', input)

в соответствии с этот тест , желаемый результат должен быть:

Sample
text

new line

||cFFFFFF00|HEX|colorText in color
this will be inner new line|cFFFFFFFF|HEX|colorReset color. The following goes into the next line too:

hello world

Вместо этого вывод:

Sample
text

new line

Text in color
this will be inner new line
Reset color. The following goes into the next line too:

hello world

Вы можете проверитьэто сам здесь .

По-видимому, метод re.sub также заменяет здесь не захваченную группу, чего я не хочу, чтобы это произошло.

Как можноМне удается правильно заменить только соответствующие группы шаблона на re.sub?

1 Ответ

0 голосов
/ 25 января 2019

Вы можете использовать это регулярное выражение с группой захвата и функцией lambda в re.sub:

>>> s=r'Sample|text||new line|||cFFFFFF00|HEX|colorText in color|this will be inner new line|cFFFFFFFF|HEX|colorReset color. The following goes into the next line too:||hello world'
>>> print re.sub(r'(\|\|\w{9}\|HEX\|color.*?|([\|])?\|\w{9}\|HEX\|color)|\|', lambda m: m.group(1) if m.group(1) else '\n', s)
Sample
text

new line
||cFFFFFF00|HEX|colorText in color
this will be inner new line|cFFFFFFFF|HEX|colorReset color. The following goes into the next line too:

hello world
  • В регулярном выражении мы используем группу захвата для текста, который мы хотим сохранить в строке замены.

  • Код в функции lambda проверяет наличие 1-й группы захвата и, если она есть, просто возвращает ее, в противном случае она заменяет | на \n.

...