re.sub()具有替换功能且具有副作用

时间:2019-09-10 17:40:45

标签: python regex replace side-effects

今天,我遇到了以下结构:

import re
l = list('1234')
print(re.sub('.', lambda _: l.pop(0), 'abcd'))

基本上,它使用sub和具有副作用的repl函数。

除了可讨论的样式问题之外,这个定义是否还明确?

例如,我在文档中找不到能够保证以任何特定顺序在比赛中调用repl的地方{em> (实际上也没有准确地一次 ,尽管官方措词有些公开)。该代码还有其他任何问题,无论是实际的还是潜在的?

1 个答案:

答案 0 :(得分:1)

根据re.sub的{​​{3}}:

  

返回通过替换 最左边 不重叠而获得的字符串   patternstring中被替换为repl的次数。

和:

  

如果repl是一个函数,则每个不重叠的函数都会被调用   模式的发生。

因此很明显re.sub从左到右搜索,并用pattern函数的返回值替换给定repl的每次出现。是的,代码的行为已得到很好的定义。但是,这样做效率不高,因为您要迭代地弹出列表的第一项,因此每次迭代的时间复杂度为 O(n)。您可以改为使用迭代器在 O(1)时间内实现相同的副作用:

import re
i = iter('1234')
print(re.sub('.', lambda _: next(i), 'abcd'))

这还将输出:

1234
相关问题