re.sub()
может использовать функцию вместо строки. Функция получит объект Match
в качестве аргумента, а затем должна вернуть строку замены.
Например, вы можете изменить часть в скобках на верхний регистр:
>>> re.sub(r"\(.*\)", lambda m: m[0].upper(), "Here is a medicine (take it twice a day)")
'Here is a medicine (TAKE IT TWICE A DAY)'
Вы можете заменить сопоставленные группы любой строкой, которую вы можете вычислить из того, что было сопоставлено.
Когда есть несколько (...)
, вы можете использовать .*?
, чтобы вместо этого соответствовать как можно меньшему в шаблоне .*
, что жадно, например,
>>> re.sub(r"\(.*\)", lambda m: m[0].upper(), "Here (is a) medicine (take it twice a day)")
'Here (IS A) MEDICINE (TAKE IT TWICE A DAY)'
>>> re.sub(r"\(.*?\)", lambda m: m[0].upper(), "Here (is a) medicine (take it twice a day)")
'Here (IS A) medicine (TAKE IT TWICE A DAY)'
Спасибо. Но как я могу заменить take it twice a day
на другое предложение лямбда? - Sakurai-ST
Пусть лямбда вернет строку, которую вы хотите заменить. (Или, если это постоянная строка, вы можете использовать ее непосредственно вместо лямбды.)
Примеры того, что вы хотите, могут помочь.
Например, я хочу чтобы изменить Here is a medicine (take it twice a day)
на Here is a medicine (take it with water)
.
Вам не нужно столько лямбда, поскольку ()
никогда не меняется в матче. Вы можете просто включить их в строку замены:
>>> re.sub(r"\(.*\)", "(take it with water)", "Here is a medicine (take it twice a day)")
'Here is a medicine (take it with water)'
Вы также можете использовать утверждения lookahead / lookbehind. Они не считаются частью матча, но часть впереди или позади матча должна соответствовать утверждениям. Для скобок это излишне, но может быть полезно в других случаях.
>>> re.sub(r"(?<=\().*(?=\))", "take it with water", "Here is a medicine (take it twice a day)")
'Here is a medicine (take it with water)'
Извините, что беспокою вас, но что мне делать, если я хочу использовать лямбду? Я думаю, что я мог бы использовать его в будущем, а не в этом случае.
Вы можете вытащить соответствующие группы из вашего шаблона внутри лямбды, например, этот же шаблон работает с двумя типами скобок, и сохраняет их такими же:
>>> re.sub(r"([([]).*?([\])])", lambda m: m[1]+"take it with water"+m[2], "Here is a medicine (take it twice a day)")
'Here is a medicine (take it with water)'
>>> re.sub(r"([([]).*?([\])])", lambda m: m[1]+"take it with water"+m[2], "Here is a medicine [take it twice a day]")
'Here is a medicine [take it with water]'
Но опять же, вы могли бы сделать это много с утверждениями. Вы также можете сделать это с обратными ссылками в строковом аргументе, лямбда не требуется:
>>> re.sub(r"([([]).*?([\])])", r"\1take it with water\2", "Here is a medicine (take it twice a day)")
'Here is a medicine (take it with water)'
>>> re.sub(r"([([]).*?([\])])", r"\1take it with water\2", "Here is a medicine [take it twice a day]")
'Here is a medicine [take it with water]'