使用re.sub结合itertools count替换第n个子串无效,求解决方法
问题分析与修正
你的代码问题出在计数器起始值和匹配项计数逻辑不匹配:
- 你用
count(0)初始化了从0开始的计数器,但调用函数时传入n=2(要替换第2个"Today")。原字符串里只有2个"Today",对应计数器值为0和1,永远不会等于2,所以替换逻辑根本没触发,返回原字符串。 - 另外,直接用
format拼接正则表达式有风险:如果子串包含.、*这类正则特殊字符,会导致匹配错误,建议用re.escape()处理子串。
修正后的代码
import re from itertools import count text = "Hello_Dear_Today_is_Nice_Today_is_Nice" def replace_nth(text, sub, rep_sub, n): # 从1开始计数,符合日常“第n个”的认知 c = count(1) # 转义子串,避免正则特殊字符干扰匹配 res = re.sub(re.escape(sub), lambda x: rep_sub if next(c) == n else x.group(), text) return res print(replace_nth(text, "Today", "Today_2", 2))
运行结果
Hello_Dear_Today_is_Nice_Today_2_is_Nice
内容的提问来源于stack exchange,提问作者trophy
相关产品推荐
相关产品推荐

