Вот для чего re.sub!Не стоит использовать регулярное выражение, чтобы найти что-то, а затем выполнить дополнительную последовательность операций поиска и замены, чтобы изменить это.С одной стороны, легко случайно заменить вещи, которые вы не имели в виду, а с другой - это делает много лишней работы.
Кроме того, вы можете сократить «#aaccee» до «#ace»,Этот пример тоже это делает:
def to_short_hex(s):
def shorten_match(match):
hex_string = match.group(0)
if hex_string[1::2]==hex_string[2::2]:
return '#'+hex_string[1::2]
return hex_string
return re.sub(r"#[\da-fA-F]{6}\b", shorten_match, s)
Пояснение
re.sub
может использовать функцию для применения к каждому совпадению.Он получает объект соответствия и возвращает строку для замены в этой точке.
Запись среза позволяет применять шаг.hex_string [1 :: 2] принимает каждый второй символ из строки, начиная с индекса 1 и заканчивая концом строки.hex_string [2 :: 2] берет каждый второй символ из строки, начиная с индекса 2 и заканчивая до конца.Таким образом, для строки «#aaccee» мы получаем «ace» и «ace», которые совпадают.Для строки "# 123456" мы получаем "135" и "246", которые не совпадают.