Почему этот код Python печатает |ab|| вместо |ab|d\nefgh|? Я пытаюсь захватить оставшуюся часть строки после c (включая несколько строк), но я не знаю, что мне не хватает.
import re
s = re.sub(
"^(.*){1}c(.*){2}$",
"|\\1|\\2|",
"""abcd
efgh""",
flags=re.DOTALL,
count=1
)
print(s)
Чтобы расширить это, я думаю, вы неправильно поняли эту конструкцию. Держу пари, ВЫ думали, что определяли эти две подфразы как №1 и №2, но это неправильно. {1} говорит: «Сделайте предыдущий токен 1 раз», а {2} говорит: «Сделайте предыдущий токен 2 раза».
@TimRoberts Да, я так и думал. Теперь понятно, что мой код работал не так, как ожидалось.






Здесь нет необходимости в {1} и {2}. Просто удалите их, и все заработает так, как вы планировали.
^(.*)c(.*)
re.sub(
"^(.*)c(.*)",
"|\\1|\\2|",
"""abcd
efgh""",
flags=re.DOTALL,
)
'|ab|d\n efgh|'
Причина, по которой вы получаете этот вывод, заключается в том, что {2} повторяет группу захвата, давая вам значение последней итерации.
В первой итерации есть та часть, которую вы хотите, но, повторяя ее снова, значение группы будет пустым, поскольку .* может соответствовать 0+ символам.
Использование (.*)c будет соответствовать до последнего появления c. Если вы хотите найти совпадение до первого появления c, вы также можете использовать инвертированный класс символов.
Если вы используете нотацию необработанной строки r"\1", вам не нужна двойная обратная косая черта.
^([^c]*)c(.*)
import re
s = re.sub(
"^([^c]*)c(.*)",
r"|\1|\2|",
"""abcd
efgh""",
flags=re.DOTALL,
count=1
)
print(s)
Выход
|ab|d
efgh|
Почему вы используете скобки
{1}и{2}(которые обычно используются для явного указания количество повторов предшествующего им символа / группы, а не для нумерации групп захвата)? В этом случае они кажутся ненужными.