我可以为此使用python ast模块吗?
我想编写一个程序,以这种方式修改python程序: 改变 “一些文字字符串%%SOMETHING 到 functioncall(“某些文字字符串%”)%SOMETHING我可以为此使用python ast模块吗?,python,parsing,Python,Parsing,我想编写一个程序,以这种方式修改python程序: 改变 “一些文字字符串%%SOMETHING 到 functioncall(“某些文字字符串%”)%SOMETHING 谢谢,您可以通过编写程序来解决这个问题。相反,只需使用有史以来最好的编辑器:Emacs。如果你还没有学过,那就值得一学。有了它,您可以通过使用它的正则表达式替换功能来解决这个问题。唯一的问题是,我很少使用正则表达式,所以我总是忘记了神秘语法的细节,仍然需要查找:P我将尝试为您再次找出它。这里有一个链接到,通过修改文档中的示例可
谢谢,您可以通过编写程序来解决这个问题。相反,只需使用有史以来最好的编辑器:Emacs。如果你还没有学过,那就值得一学。有了它,您可以通过使用它的正则表达式替换功能来解决这个问题。唯一的问题是,我很少使用正则表达式,所以我总是忘记了神秘语法的细节,仍然需要查找:P我将尝试为您再次找出它。这里有一个链接到,通过修改文档中的示例可能会更简单
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;-)。是另一个可能有用的so问题
我推测,ast
模块没有返回源代码的功能,但是Armin Ronacher编写了一个模块,它实现了一个to_source
函数,只用于ast
节点
我自己还没试过这么做
import re
pattern = r'(".+? %")(?= %)'
oldstr = '"some literal string %" % SOMETHING'
newstr = re.sub(pattern, r'functioncall(\1)', oldstr)
尝试类似的方法(当然是使用文件I/O)我还没有使用过
ast
,所以我真的不知道这样做是否更容易,但在我看来,如果你只是做一个简单的搜索替换,而不是真正做很多复杂的解析,那么就没有必要使用ast
,我需要一种戏剧性的方法,这样我就可以了把它作为一种预处理器包含在另一个程序中。理论上,是吗?但是如果你想在代码方面做到这一点,那么只需使用python的re
模块来处理正则表达式。夸张地说,我键入了?F*ing拼写检查器。我是编程上的。我希望你可以使用python中的re.sub来查找匹配的模式,并用随便你。AST在python 2.6中是不推荐的,在3.0中是adios,所以…Regex可以轻松处理这个问题。作为Emacs用户,我觉得有必要补充一点,Emacs不是“轻松”使用Regex的唯一方法。“编程”选项还可以包括许多*nix工具(“sed”,等等)以及Python、Perl等语言。使用2to3工具可能会有更好的运气,它是为源代码到源代码转换而设计的。与OP所要求的相比,似乎有不必要的引号。我相信用tokvalue替换repr(tokvalue)会得到期望的结果。