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

Python 替换字符串中某些未知的单词,python,Python,我正在寻找一种更优雅的解决方案来替换字符串中一些预先未知的单词,除了not、和和或: 仅作为下面的示例,但可以是任何东西,但始终可以使用eval()进行计算) 输入:(是否定义A(定义B而不是(定义C)))和定义A 输出:(self.DEFINE_A或not(self.DEFINE_B和not(self.DEFINE_C)))和self.DEFINE_A 我创造了一个解决方案,但看起来有点奇怪。有没有更干净的方法 s = '(DEFINE_A or not(DEFINE_B and not (D

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

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

输入:
(是否定义A(定义B而不是(定义C)))和定义A

输出:
(self.DEFINE_A或not(self.DEFINE_B和not(self.DEFINE_C)))和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+
只匹配单词。然后,使用a,您可以排除您不想要的。现在只需直接使用该模式即可:

s='(是否定义_A(定义_B而不是(定义_C)))和定义_A'
new=re.sub(r“(?!and | not | or)\b(\w+),r“self.\1”,s)
打印(新)
这将提供:

(self.DEFINE_A or not(self.DEFINE_B and not (self.DEFINE_C))) and self.DEFINE_A
您可以测试并查看这个正则表达式是如何工作的


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

new = re.sub(r"([A-Z\d_]+)", r"self.\1", s)
这不仅是一个更简单的模式(为了可读性),而且效率更高。在这个例子中,与原始的196步相比,它只需要70步(可以在链接的右上角看到)


你可以看到新的模式在起作用。

变量的形式是否总是
DEFINE\ux
?不,它们不是。e、 g.可以是“启用日志记录”或“配置键盘”只是想确定我的答案是否更具体,但我想不是。。。它们将始终大写吗?是的,它们将始终大写。然后查看我的编辑以获得简化的更高效的版本:)