gpt4 book ai didi

Python使用正则表达式递归替换字符串

转载 作者:行者123 更新时间:2023-11-28 21:28:50 26 4
gpt4 key购买 nike

我为此尝试了不同的想法,但尚未成功。因此这篇文章。

一些背景:我正在尝试破译一个可能包含来自单独文件的变量的 Makefile。我已经成功读取了 Makefile 中的所有变量,并将其成功包含到 python 字典中。但现在我发现每个值本质上引用了字典中的其他变量。我想要做的是展开字典中的所有值,以获得独立于其他键/值对的文本。这肯定涉及递归(恕我直言),但我很有兴趣听到任何其他建议。

请注意,并非所有变量都可能具有与其关联的值。在这种情况下,请将键替换为 NULL 字符串。

现在用一些代码来演示上面所说的内容:

设键值对列表为

*A = -L${F} ${B} ${D},

*B = -L/myhome,

*F =/usr/lib

我想编写一个Python脚本(可能使用正则表达式)来递归地用相应的键替换与“${XXX}”匹配的值,直到没有更多可用的值与规定的模式匹配(即,所有内容都展开) 。由于 D 没有与之关联的值,因此我希望 A 的值最终为(例如)

*A = -L/usr/lib -L/myhome

提前致谢。任何帮助将不胜感激。

最佳答案

利用re.subn,它返回替换的数量(这样你就知道何时停止)并接受repl参数的函数(从vars字典中选择值) ):

import re

vs = {
'A' : '-L${F} ${B} ${D}',
'B' : '-L/myhome',
'F' : '/usr/lib',
}

while 1:
treps = 0
for k in vs:
ns, nreps = re.subn(r'''\${(\w+)}''', lambda match: vs.get(match.group(1), ''), vs[k])
if nreps: vs[k] = ns
treps += nreps
if not treps: break

print(vs)
# {'A': '-L/usr/lib -L/myhome ', 'B': '-L/myhome', 'F': '/usr/lib'}

请注意,如果 A=${A},或者 A=${B} 且 B=${A},则上述程序将永远不会结束。您没有指定在这种情况下应该发生什么。

关于Python使用正则表达式递归替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7087905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com