Подпрограмма регулярного выражения игнорирует символ конца строки

Почему этот код 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} (которые обычно используются для явного указания количество повторов предшествующего им символа / группы, а не для нумерации групп захвата)? В этом случае они кажутся ненужными.

Green Cloak Guy 09.04.2021 07:19

Чтобы расширить это, я думаю, вы неправильно поняли эту конструкцию. Держу пари, ВЫ думали, что определяли эти две подфразы как №1 и №2, но это неправильно. {1} говорит: «Сделайте предыдущий токен 1 раз», а {2} говорит: «Сделайте предыдущий токен 2 раза».

Tim Roberts 09.04.2021 07:26

@TimRoberts Да, я так и думал. Теперь понятно, что мой код работал не так, как ожидалось.

Mei Zhang 09.04.2021 07:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь нет необходимости в {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(.*)

Демо Regex

import re

s = re.sub(
    "^([^c]*)c(.*)",
    r"|\1|\2|",
    """abcd
    efgh""",
    flags=re.DOTALL,
    count=1
)
print(s)

Выход

|ab|d
    efgh|

Другие вопросы по теме

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

Как получить строковые данные из поля формы многие ко многим в django
Как исправить ошибку IndexError на Selenium при попытке автоматизировать заполнение текстового поля формы Google? (Я использовал элемент проверки, чтобы найти имя класса текстового поля)
Как преобразовать фрейм данных Python в JSON с фиксированными ключами и столбцами фрейма данных в качестве значений
Как передать список в objects.get в Django
Как я могу удалить ошибки в Pygame?
MongoDB pymongo - обновить первичный ключ
Пропуск значений времени без даты при преобразовании в datetime в Pandas
Лучший подход к разделению одного столбца на несколько столбцов Dataframe PySpark
Как я могу подсчитать часть строки в определенной строке в Python?
У меня есть Dataframe в пандах со столбцом Номер случая, Истинное значение, Прогноз, уверенность. Мне нужно разделить значения соответственно со всей показанной комбинацией