gpt4 book ai didi

python - 替换字符串中的某些未知单词

转载 作者:行者123 更新时间:2023-12-04 01:10:28 25 4
gpt4 key购买 nike

我正在寻找一种更优雅的解决方案来替换字符串中一些预先未知的单词,notandor 除外:

仅作为下面的示例,但可以是任何东西,但始终可以使用 eval()) 进行评估

输入:(DEFINE_A or not(DEFINE_B and not (DEFINE_C))) and DEFINE_A

输出:(self.DEFINE_A or not(self.DEFINE_B and not (self.DEFINE_C))) and self.DEFINE_A

我创建了一个解决方案,但它看起来有点奇怪。有没有更干净的方法?

s = '(DEFINE_A or not(DEFINE_B and not (DEFINE_C))) and DEFINE_A'
words = re.findall(r'[\w]+|[()]*|[ ]*', s)
for index, word in enumerate(words):
w = re.findall('^[a-zA-Z_]+$', word)
if w and w[0] not in ['and','or','not']:
z = 'self.' + w[0]
words[index] = z
new = ''.join(str(x) for x in words)
print(new)

将正确打印:

(self.DEFINE_A or not(self.DEFINE_B and not (self.DEFINE_C))) and self.DEFINE_A

最佳答案

首先,您可以使用简单的 \w+ 只匹配单词。然后,使用 negative lookahead您可以排除您不想要的。现在剩下要做的就是使用 re.sub直接使用该模式:

s = '(DEFINE_A or not(DEFINE_B and not (DEFINE_C))) and DEFINE_A'

new = re.sub(r"(?!and|not|or)\b(\w+)", r"self.\1", s)

print(new)

将给出:

(self.DEFINE_A or not(self.DEFINE_B and not (self.DEFINE_C))) and self.DEFINE_A

您可以测试并查看此正则表达式的工作原理 here .


如果您的“变量”的名称总是大写,这会稍微简化模式并使其更加高效。只需使用:

new = re.sub(r"([A-Z\d_]+)", r"self.\1", s)

这不仅是一个更简单的模式(为了可读性),而且效率更高。在此示例中,与原始步骤的 196 步相比,它只需要 70 步(可以在链接的右上角看到)。

您可以看到正在运行的新模式 here .

关于python - 替换字符串中的某些未知单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64993333/

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