Способы замены чисел в строке на Python
Основной подход: замена чисел с помощью регулярных выражений
Наиболее универсальный и гибкий способ замены чисел в строке в Python - использование модуля re и функции re.sub(). Этот метод подходит для замены всех чисел, независимо от их формата (целые, дробные, отрицательные).
import re
text = "Температура 23 градуса, давление 1013.25 гПа"
result = re.sub(r'\d+\.?\d*', 'XXX', text)
print(result)заменить текст python (замена подстроки в строке в python)
Температура XXX градуса, давление XXX гПа
Python заменить число (замена числа в python (например, в строке))
Пояснение: регулярное выражение \d+\.?\d* находит одно или более цифр (\d+), за которыми может следовать точка (\.?) и ещё несколько цифр (\d*). Таким образом, заменяются как целые, так и дробные числа. Если точка есть, но после неё нет цифр, число всё равно будет найдено. Для замены только целых чисел можно использовать \d+.
Типичные проблемы
- Выражение
\d+\.?\d*может захватить часть строки, например, "23." (с точкой в конце) - это не всегда желательно. Используйте более точный шаблон для дробных чисел:\d+(\.\d+)?. - Для отрицательных чисел добавьте необязательный минус:
-?\d+(\.\d+)?. - При наличии чисел в составе слов (например, "abc123") регулярное выражение заменит только цифровую часть. Чтобы избежать замены букв, можно использовать границы слов
\b.
Как заменить конкретное число в строке, если известно его точное значение?
text = "Код 404 и статус 404 ошибка"
result = text.replace('404', '000')
print(result)Python часть текста (извлечение подстроки из строки в python)
Код 000 и статус 000 ошибка
Print split python (использование split с print в python)
Метод str.replace() заменяет все вхождения точной строки. Число указывается как строка. Если нужно заменить только первое вхождение, используйте третий аргумент: text.replace('404', '000', 1).
Проблема: если число является частью другого числа (например, "1404" содержит "404"), замена произойдёт и в нём. Для точной замены целого числа лучше использовать регулярное выражение с границами слова:
import re
text = "Код 404 и 1404"
result = re.sub(r'\b404\b', '000', text)
print(result)код пробела python (код символа пробела в python)
Код 000 и 1404
Python количество пробелов (количество пробелов в строке python)
Как заменить все цифры на звёздочки или другие символы?
import re
text = "Пароль: 1234, код: 567"
result = re.sub(r'\d', '*', text)
print(result)количество символов в тексте python (подсчет количества символов в строке python)
Пароль: ****, код: ***
Python найти строку (поиск подстроки в строке python)
Здесь \d соответствует каждой отдельной цифре. Замена происходит по одной цифре. Если нужно заменить целые числа целиком (например, "1234" заменить на "****"), используйте \d+.
Как заменить числа с плавающей точкой?
import re
text = "Значение PI=3.14159, e=2.71828"
result = re.sub(r'\d+\.\d+', 'FLOAT', text)
print(result)Python пробелы (пробелы в python)
Значение PI=FLOAT, e=FLOAT
символ пробел python (символ пробела в python)
Шаблон \d+\.\d+ требует, чтобы после точки была хотя бы одна цифра. Если число может быть целым или дробным, используйте \d+(\.\d+)?.
Как заменить отрицательные числа?
import re
text = "Температура -5, а вчера было 10"
result = re.sub(r'-?\d+', 'NUM', text)
print(result)Python первое число в строке (извлечение первого числа из строки в python)
Температура NUM, а вчера было NUM
Python лишние пробелы (удаление лишних пробелов в python)
Обратите внимание: шаблон -?\d+ захватит минус и цифры, но если в строке есть тире, не являющееся минусом (например, дефис), оно тоже может быть захвачено. Уточните контекст.
Как заменить числа, но оставить некоторые (например, номера телефонов)?
Можно использовать сложное регулярное выражение с негативным просмотром вперёд/назад. Например, заменить все числа, кроме тех, что начинаются с '+7':
import re
text = "Телефон: +71234567890, код: 123"
pattern = r'(?# Это упрощённый пример. Для точного номера телефона нужен более строгий шаблон.
result = re.sub(pattern, 'HIDDEN', text)
print(result)Python длина строки (длина строки в python)
Телефон: +7HIDDEN, код: HIDDEN
Применение границ \b и просмотров требует аккуратности. Возможны ошибки с пересечением шаблонов.
Как заменить числа с помощью translate или list comprehension?
Для замены каждой цифры на символ можно использовать str.maketrans и translate:
text = "123-456-7890"
trans_table = str.maketrans('0123456789', '**********')
result = text.translate(trans_table)
print(result)***-***-****
Но этот метод заменяет только одну цифру на один символ, не объединяя последовательности. Для замены целых чисел на одно значение (например, "123" на "X") translate не подходит.
Альтернатива с list comprehension:
text = "a1b2c3"
result = ''.join('X' if c.isdigit() else c for c in text)
print(result)aXbXcX
Также замена по одной цифре. Для замены целых чисел потребуется группировка цифр. Можно использовать itertools.groupby, но это сложнее.
Расширенные примеры замены чисел в строке
Пример 1: замена целых чисел, исключая числа внутри слов
import re
text = "abc123, 456def, 789, ghi0"
pattern = r'\b\d+\b'
result = re.sub(pattern, 'NUM', text)
print(result)abc123, 456def, NUM, ghi0
Пояснение: граница слова \b требует, чтобы цифры были отделены от букв нецифровыми символами. "abc123" и "456def" содержат цифры, примыкающие к буквам без разделителя, поэтому они не заменяются.
Пример 2: замена чисел с европейским десятичным разделителем (запятая)
import re
text = "Цена 12,50 евро, количество 3"
pattern = r'\d+,\d+'
result = re.sub(pattern, 'PRICE', text)
print(result)Цена PRICE евро, количество 3
Чтобы заменить и целые числа, и числа с запятой, используйте \d+([.,]\d+)?.
Пример 3: замена чисел в CSV строке (только поля, содержащие числа)
import re
csv_line = "Иван,30,Москва,180.5"
# Заменим второе поле (возраст) и четвёртое (рост) на '***'
parts = csv_line.split(',')
parts[1] = re.sub(r'\d+', '***', parts[1])
parts[3] = re.sub(r'\d+\.?\d*', '***', parts[3])
masked = ','.join(parts)
print(masked)Иван,***,Москва,***
При работе с CSV важно учитывать возможные кавычки и экранирование.
Пример 4: замена чисел, которые являются номерами кредитных карт (16 цифр, сгруппированы по 4)
import re
text = "Карта: 1234 5678 9012 3456, срок: 12/24"
pattern = r'\b\d{4} \d{4} \d{4} \d{4}\b'
result = re.sub(pattern, '**** **** **** ****', text)
print(result)Карта: **** **** **** ****, срок: 12/24
Это частный случай. Для более сложных форматов (с дефисами, разной длиной) шаблон нужно адаптировать.
Пример 5: замена чисел с контекстом (заменить все числа, кроме тех, что следуют за словом "код")
import re
text = "Код 123, пароль 456, код 789"
# Негативный просмотр назад: число не должно быть после слова 'код'
pattern = r'(?result = re.sub(pattern, '***', text, count=0, flags=re.IGNORECASE)
print(result)Код 123, пароль ***, код 789
Обратите внимание: просмотр назад фиксированной длины. Если между 'код' и числом может быть пробел, табуляция и т.д., шаблон усложняется. Возможна проблема с регистром (использован флаг IGNORECASE).
Пример 6: замена чисел с использованием re.sub с функцией замены
import re
text = "Числа: 10, 20, 30"
def replacer(match):
num = int(match.group())
return str(num * 2)
result = re.sub(r'\d+', replacer, text)
print(result)Числа: 20, 40, 60
Функция позволяет выполнять любые преобразования (математические, форматирование, проверки).
Пример 7: замена чисел с плавающей точкой на округлённые значения
import re
text = "Значения: 3.14159, 2.71828"
def rounder(match):
return f"{float(match.group()):.2f}"
result = re.sub(r'\d+\.\d+', rounder, text)
print(result)Значения: 3.14, 2.72
Пример 8: замена чисел в строке с помощью метода subn (получение количества замен)
import re
text = "a1b2c3"
new_text, count = re.subn(r'\d', 'X', text)
print(f"Результат: {new_text}, замен: {count}")Результат: aXbXcX, замен: 3