我想编写一个以这种方式修改python程序的程序:
变化
“一些文字字符串%”%SOMETHING
到
functioncall(“some literal string%”)%SOMETHING
谢谢,
答案 0 :(得分:2)
tokenize可能更简单 - 调整文档中的示例
import cStringIO
import tokenize
class Lookahead(object):
def __init__(self, s):
self._t = tokenize.generate_tokens(cStringIO.StringIO(s).readline)
self.lookahead = next(self._t, None)
def __iter__(self):
return self
def next(self):
result = self.lookahead
if result is None: raise StopIteration
self.lookahead = next(self._t, None)
return result
def doit(s):
toks = Lookahead(s)
result = []
for toktype, tokvalue, _, _, _ in toks:
if toktype == tokenize.STRING:
pk = toks.lookahead
if pk is not None and pk[0] == tokenize.OP and pk[1] == '%':
result.extend([
(tokenize.NAME, 'functioncall'),
(tokenize.OP, '('),
(tokenize.STRING, repr(tokvalue)),
(tokenize.OP, ')')
])
continue
result.append((toktype, tokvalue))
return tokenize.untokenize(result)
print doit('"some literal string %" % SOMETHING')
这会打印functioncall ('"some literal string %"')%SOMETHING
。间距非常奇特(需要更多努力才能使间距恰到好处 - 但是对于从修改后的AST重建源来说情况更糟),但如果您要做的就是导入/运行,那就没关系了。结果代码(如果你想获得可读性和可编辑的代码,那就不那么好了 - 但这是一个足够大的问题,我建议单独使用Q; - )。
答案 1 :(得分:1)
您可以通过编写程序来解决这个问题。而只是使用有史以来最好的编辑器:Emacs。值得学习,如果你还没有。有了它,您可以通过使用其正则表达式替换功能来解决这个问题。唯一的麻烦是我很少使用正则表达式,所以我总是忘记了神秘语法的细节,还得继续查看:P我会再试一次。这是Search & Replace Info for Emacs - scroll down for using regex's
的链接答案 2 :(得分:0)
Here是另一个可能有用的问题。
我认为ast
模块没有返回源代码的工具,但是Armin Ronacher编写了一个模块codegen,它实现了to_source
函数来实现这一点用于ast
个节点。
我自己没试过这样做。
答案 3 :(得分:0)
import re
pattern = r'(".+? %")(?= %)'
oldstr = '"some literal string %" % SOMETHING'
newstr = re.sub(pattern, r'functioncall(\1)', oldstr)
尝试类似的东西。 (当然,虽然有文件I / O.)我还没有和ast
一起工作,所以我真的不知道是否使用它会更容易这样的东西,但它似乎我,如果你只是做一个简单的搜索替换,而不是实际做了很多复杂的解析,那么就不需要使用ast
。