如何替换大海捞针的第N个外观?(蟒蛇)
我正在尝试替换大海捞针中的第N个外观。我只想通过re.sub()来做到这一点,但是似乎无法提出一个合适的正则表达式来解决这个问题。我正在尝试适应:http
:
//docstore.mik.ua/orelly/perl/cookbook/ch06_06.htm,但是我认为跨多行失败。
我当前的方法是一种迭代方法,该方法从每次突变后的开始就查找每次出现的位置。这是非常低效的,我想获得一些意见。谢谢!
-
我已经为此苦苦挣扎了一段时间,但是我找到了一个我认为非常pythonic的解决方案:
>>> def nth_matcher(n, replacement): ... def alternate(n): ... i=0 ... while True: ... i += 1 ... yield i%n == 0 ... gen = alternate(n) ... def match(m): ... replace = gen.next() ... if replace: ... return replacement ... else: ... return m.group(0) ... return match ... ... >>> re.sub("([0-9])", nth_matcher(3, "X"), "1234567890") '12X45X78X0'
编辑 :匹配器由两部分组成:
-
该
alternate(n)
功能。这将返回一个生成器,该生成器返回一个无限序列True / False,其中每个第n个值均为True。觉得像list(alternate(3)) == [False, False, True, False, False, True, False, ...]
。 -
该
match(m)
功能。这是传递给的函数re.sub
:它获取alternate(n)
(gen.next()
)中的下一个值,如果是,True
它将替换匹配的值;否则,它将保持不变(将其自身替换)。
我希望这足够清楚。如果我的解释不明确,请这样说,我会改善的。
-