如何替换大海捞针的第N个外观?(蟒蛇)

发布于 2021-01-29 15:03:58

我正在尝试替换大海捞针中的第N个外观。我只想通过re.sub()来做到这一点,但是似乎无法提出一个合适的正则表达式来解决这个问题。我正在尝试适应:http
:
//docstore.mik.ua/orelly/perl/cookbook/ch06_06.htm,但是我认为跨多行失败。

我当前的方法是一种迭代方法,该方法从每次突变后的开始就查找每次出现的位置。这是非常低效的,我想获得一些意见。谢谢!

关注者
0
被浏览
271
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我已经为此苦苦挣扎了一段时间,但是我找到了一个我认为非常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'
    

    编辑 :匹配器由两部分组成:

    1. alternate(n)功能。这将返回一个生成器,该生成器返回一个无限序列True / False,其中每个第n个值均为True。觉得像list(alternate(3)) == [False, False, True, False, False, True, False, ...]

    2. match(m)功能。这是传递给的函数re.sub:它获取alternate(n)gen.next())中的下一个值,如果是,True它将替换匹配的值;否则,它将保持不变(将其自身替换)。

    我希望这足够清楚。如果我的解释不明确,请这样说,我会改善的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看