在我开始之前,我知道有比正则表达式更好的方法(比如标记器),这不是问题所在。我已经被正则表达式卡住了,它已经可以按我的需要工作了,除了一种特殊情况,这是我需要建议的。
我需要浏览一些类似 JavaScript 的代码,并new
在每个对象声明前插入关键字。我已经知道需要这个关键字的所有对象的名称,并且我知道在我开始之前它们都不会在代码中包含那个关键字(所以我不需要处理重复的new
单词或猜测某物是否是一个对象与否。例如,典型的行可能如下所示:
foo = Bar()
我已经知道这Bar
是一个“类”并且需要“新”来进行对象声明。以下正则表达式可以解决问题:
for classname in allowed_classes:
line = re.sub(r'^([^\'"]*(?:([\'"])[^\'"]*\2)*[^\'"]*)\b(%s\s*\()' % classname, r'\1new \3', line)
它就像一个魅力,甚至确保classname
当它在字符串内时不要触摸(正则表达式的第一部分告诉它事先确保有偶数个引号 - 这有点天真,因为它会与嵌套中断引号,但我不需要处理这种情况)。问题是,类名也可能包含$
在其中。$Bar
因此,如果allowed_classes 中存在以下行,则也允许:
foo = $Bar()
由于美元符号,上述正则表达式将忽略它。我认为逃避它会起作用,但即使$Bar
是其中一个类,这个逻辑似乎也对上面的行没有影响:
for classname in allowed_classes:
line = re.sub(r'^([^\'"]*(?:([\'"])[^\'"]*\2)*[^\'"]*)\b(%s\s*\()' % re.escape(classname), r'\1new \3', line)
我也尝试过手动逃避它,\
但它也没有效果。有人可以解释为什么转换$
为\$
不起作用以及可以解决什么问题吗?
谢谢