Функция sub в regex может принимать функцию в качестве аргумента repl.
📄 Из документации:
If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.
То есть для каждого совпадения будет вызвана функция для вычисления замены вместо замены на одну и ту же строку для всех совпадений.
Иными словами, для замены разных совпадений на разные строки не потребуется запускать re.sub() много раз для каждой строки замены. Достаточно определить функцию, которая вернёт строку для каждого из совпадений.
Описание слишком запутанное🤔, давайте лучше рассмотрим на простом примере:
Создаем карту замены. То есть какие строки на какие требуется менять.
remap = {
'раз': '1',
'два': '2',
'три': '3',
'четыре': '4',
'пять': '5',
}
Пишем функцию поиска строки для замены. Единственным аргументом будет объект re.Match.
Используя данные этого объекта мы вычисляем замену on-the-fly!
def get_str(match: re.Match):
word = match.group(1)
return remap.get(word.lower()) or word
Пример текста.
text = '''Раз Два Три Четыре Пять
Вместе будем мы считать
Пять Четыре Три Два Раз
Мы считать научим вас
'''
Теперь запускаем re.sub и вместо строки замены (repl) подаём имя функции.
(Данный паттерн ищет отдельные слова в тексте)
>>> print(re.sub(r'(\w+)', get_str, text))
1 2 3 4 5
Вместе будем мы считать
5 4 3 2 1
Мы считать научим вас
Думаю, достаточно наглядно 🤓
#libs#regex
#Italia
Domani prenderà il via il congresso di #A1MDP|S&D, dove parteciperanno Letta, Conte, Orlando, Di Maio, Landini e Calenda. Non è stato inviato invece Matteo Renzi, poiché, secondo #Scotto, Italia Viva si è collocata col centrodestra.
@UltimoraPolitics
https://x.com/SavinoBalzano/status/1971129589729562929?t=lFhJPoIZlMv1Vvnt_O9B3Q&s=19
Guardate questi 60 secondi di video e ditemi se in questo Paese non c’è un problema democratico grande come un grattacielo.
Ci si indigna per il mancato sostegno del governo alla #GlobalSumudFlotilla, ma appena fai notare che anche #Mattarella resta in silenzio, subito scattano l’imbarazzo, i balbettii, la prudenza.
Insomma: attaccare #Meloni o #Salvini va bene (lasciamo perdere #Tajani che ormai non lo possono vedere manco i 300 dipendenti della Farnesina), ma guai a toccare il Presidente della Repubblica.
Eppure, tra le imbarcazioni colpite sembra ce ne fossero anche alcune battenti bandiera italiana, il nostro tricolore.
Il Capo dello Stato rappresenta l’unità nazionale, lo dice l’articolo 87 della Costituzione. E allora? Pensa come siamo ridotti.
In diretta dalla #Flotilla, l’onorevole #Scotto ci spiega che #SergioMattarella non è tenuto a intervenire. Avrà pensato lo stesso quando ha paragonato la #Russia al Terzo Reich?
Se c’è un potere che non si può criticare, la democrazia non esiste: fatevene una ragione. E se certi silenzi li condannate e altri li giustificate, la vostra battaglia perde autorevolezza e credibilità.
100 punti in meno al GrifonSergio.
#BattitoriLiberi: dal lunedì al venerdì alle 17, con Gianluca Fabi, su Radio Cusano.
Il Presidente della Camera #Fontana comunica le seguenti censure con interdizioni ai lavori del parlamento dopo i fatti sfociati nell'aggressione a #Donno: 15 giorni a Igor #Iezzi (#Lega); 7 ad #Amich (#Fdi), #Cangiano (#Fdi), #Forgiuele (#Lega), #Mollicone (#Fdi) e #Stumpo (#Pd); 4 a #Donno (M5S); 3 ad #Amendola (#Pd) e 3 a #Candiani (#Lega); 2 a #Scotto (#Pd) e 2 a #Stefanazzi (#Pd). (Dire)
@UltimoraPolitics