【发布时间】:2019-09-10 17:40:45
【问题描述】:
今天我遇到了以下构造:
import re
l = list('1234')
print(re.sub('.', lambda _: l.pop(0), 'abcd'))
基本上,它使用sub 和具有副作用的repl 函数。
抛开有争议的风格问题不谈,这个定义是否明确?
例如,我在文档中找不到任何地方可以保证repl 会在匹配项上被调用以任何特定顺序(实际上也没有恰好一次,尽管官方措辞在某种程度上可以解释)。此代码是否存在任何其他问题(实际问题或潜在问题)?
【问题讨论】:
-
AFAICT,你是对的,而且这个库函数的行为定义不够明确,无法保证相关代码的安全。
-
repl在找到模式时被调用,据我所知,正则表达式从左到右进行匹配,所以我看不出有任何理由随机调用repl,在 Docs 上似乎也差不多re.sub -
@CodeManiac:一方面,我们可以很容易地想象出一个并行匹配的正则表达式引擎。 (ieeexplore.ieee.org/document/7023656)
-
@NPE 哦,以前不知道,不过谢谢你的链接 :)
-
AFAIK 现实世界中没有可以开始并行匹配的正则表达式引擎,更不用说仅通过使用几个特定模块来利用并行编程的 Python。此外,如果您阅读链接到的那篇论文,所提出的算法接受非常有限的正则表达式子集,这不允许几乎任何现有的正则表达式引擎在其实现中以某种方式考虑它。因此 CodeManiac 的评论适用。
标签: python regex replace side-effects