gpt4 book ai didi

python - 有选择地替换字符串中特定的嵌套定界符(括号),同时尊重嵌套

转载 作者:太空宇宙 更新时间:2023-11-03 15:30:43 25 4
gpt4 key购买 nike

我有很多字符串,我试图有选择地用 f.__getitem__(--whatever--, x=x )。这是留给我使用 eval 调用修补一些旧的复杂代码的最后一个选项,不幸的是,我一直坚持使用它。替换 f[ 很容易,但很难知道 ] 的实例是否与此模式或其他一些模式相关联列表 [--whatever--] 或索引 .loc[--whatever--]. 等各种模式 ] 不属于我的字符串中完整 [] 的一部分。

我最近的解决方案尝试使用正则表达式:1) sub ([^f])[(.+?)] with\1openbracket\2closebracket 保留不属于 f[] 的 []2)剩下的[]3) 用 [] 分回开括号和闭括号

问题是这不能处理许多嵌套情况,如下例所示。我正在寻找一个更全面的解决方案来确定给定的 ] 是否与 f[] 或其他一些结构相关联。有没有办法用 pyparsing 或其他模块做到这一点?

例子

f[r@ndom t3xt] + [some r@ndom t3xt] + [f[more r@ndom t3xt] / f[more t3xt]] + [f[f[more t3xt] + 3]]

应该变成

f.__getitem__(r@ndom t3xt, x=x) + [some r@ndom t3xt] + [f.__getitem__(more r@ndom t3xt, x=x) / f.__getitem__(more t3xt, x=x)] + [f.__getitem__(f.__getitem__(more t3xt) + 3)]

最佳答案

嵌套 [] 使这成为一个重要的问题。 pyparsing 有一个名为 nestedExpr 的“拐杖”表达式方法,可以轻松匹配 () 和 [] 等嵌套分隔符。 pyparsing 也有 transformString 方法,用于将解析后的数据转换为不同的形式。我们可以使用解析时回调(或“解析操作”)重复转换任何嵌套的 f[zzz] 项,直到所有项都已转换:

import pyparsing as pp

fname = pp.Keyword('f')
index_expr = pp.nestedExpr('[', ']')
# nestedExpr will give a nested list by default, we just want the original raw text
f_expr = fname + pp.originalTextFor(index_expr)("index_expr")

# define a parse action to convert the f[aaa] format to f._getitem__(aaa, x=x)
def convert_to_getitem(t):
# get the contents of the index_expr, minus the leading and trailing []'s
index_expr = t.index_expr[1:-1]

# repeatedly call transform string to get further nested f[] expressions, until
# transformString stops returning a modified string
while True:
transformed = f_expr.transformString(index_expr)
if transformed == index_expr:
break
index_expr = transformed

# reformat to use getitem
return "f.__getitem__({}, x=x)".format(transformed)

# add the parse action to f_expr
f_expr.addParseAction(convert_to_getitem)


# use transformString to convert the input string with nested expressions
sample = "f[r@ndom t3xt] + [some r@ndom t3xt] + [f[more r@ndom t3xt] / f[more t3xt]] + [f[f[more t3xt] + 3]]"
print(f_expr.transformString(sample))

打印:

f.__getitem__(r@ndom t3xt, x=x) + [some r@ndom t3xt] + [f.__getitem__(more r@ndom t3xt, x=x) / f.__getitem__(more t3xt, x=x)] + [f.__getitem__(f.__getitem__(more t3xt, x=x) + 3, x=x)]

这还应该处理可能出现在带引号的字符串中的“[]”。

关于python - 有选择地替换字符串中特定的嵌套定界符(括号),同时尊重嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57983700/

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