Хотели убрать ID-, а потеряли букву D: почему strip меняет код целиком
Есть учебная выгрузка с обозначениями ID-D42, ID-42 и D42. Нужно снять ровно начальную метку ID-, если она есть. Ожидаемые результаты — D42, 42 и D42.
На первый взгляд для этого подходит строка:
code = "ID-D42"
print(code.strip("ID-"))
Но программа печатает 42. Буква D, которая была частью самого обозначения, исчезла вместе с меткой. Исключения нет, результат выглядит правдоподобно. Такую ошибку легко пропустить, если проверять только пример ID-42.
Что попросили у Python
У strip аргумент задаёт набор отдельных символов, которые можно снимать с обоих краёв строки. Здесь это I, D и дефис. Метод снимает их, пока не встретит другой символ. После начального ID- он видит ещё одну D и снимает её тоже. Похожий lstrip работает только слева, но смысл аргумента остаётся тем же: набор символов, а не целая метка. Это поведение описано в документации строк Python: https://docs.python.org/3/library/stdtypes.html#str.strip.
Чтобы удалить один точный префикс, подходит removeprefix, доступный с Python 3.9. Описание метода: https://docs.python.org/3/library/stdtypes.html#str.removepr....
for code in ["ID-D42", "ID-42", "D42", "42-ID"]:
result = code.removeprefix("ID-")
print(repr(code), "->", repr(result))
Результат:
'ID-D42' -> 'D42'
'ID-42' -> '42'
'D42' -> 'D42'
'42-ID' -> '42-ID'
Теперь обозначение без начальной метки сохраняется. Конечное -ID тоже не трогаем: задача касалась только начала.
Проверка, которая отличает две операции
Для такой очистки полезны не десять похожих примеров, а несколько разных условий:
- Метка есть, а следующий символ совпадает с одной из её букв: ID-D42.
- Метки нет, но строка начинается с D: D42.
- Похожая метка стоит в конце: 42-ID.
- Метка повторяется: ID-ID-42. Одно применение removeprefix оставит ID-42.
- Строка пустая: результат тоже пустой.
Последние два случая заставляют уточнить требование. Нужно удалить одну метку или все подряд? Пустой результат допустим или это ошибка входных данных? Сам метод этого не решает.
Если в исходной выгрузке встречаются пробелы, другой регистр или кириллические буквы, это отдельные условия. Не стоит незаметно добавлять к исправлению ещё несколько преобразований: можно изменить значимый код. Сначала сохраняем исходный столбец и проверяем результат на небольшой копии данных.
В примере все обозначения придуманы. Текст подготовлен с помощью ИИ; код выполнен локально, результаты сверены. Это разбор поведения Python, без заявления о реальном сбое у клиента.
