2010-06-18 75 views
1

我想編寫修改的Python程序這樣的程序:我可以爲此使用python ast模塊嗎?

變化

「的一些文字字符串%」 %SOMETHING

functioncall(「一些文字字符串%「)%SOMETHING

謝謝,

+0

使用專爲源到源轉換設計的2to3工具,您可能會有更好的運氣。 – 2010-06-18 13:52:58

回答

1

你可以不必寫一個解決這個問題節目。相反,只需使用有史以來最好的編輯器:Emacs。值得學習,如果你還沒有。有了它,你可以使用它的正則表達式替換功能來解決這個問題。唯一的麻煩是我很少使用正則表達式,因此我總是忘記了隱含語法的細節,並且仍然需要查看它:P我會嘗試再次爲您找到它。下面是對Search & Replace Info for Emacs - scroll down for using regex's

+1

我需要一種方法來完成它,所以我可以將它作爲一種預處理程序包含在另一個程序中。 – 2010-06-18 13:03:24

+0

[Melodrama](http://en.wikipedia.org/wiki/Melodrama)tically,是吧?但是如果你想以代碼方式進行,那麼只需使用python的're'模塊來處理正則表達式。 – JAB 2010-06-18 14:42:43

+0

Melodramatically我鍵入?拼寫檢查器。我是編程式的。 – 2010-06-18 15:24:55

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 ;-)。

+0

與OP所要求的相比,似乎存在不需要的引號。我相信用tokvalue代替repr(tokvalue)可以得到理想的結果。 – 2015-10-13 19:40:39

0

Here是另一個可能有用的SO問題。

我收集了ast模塊沒有一個工廠返回到源代碼,但阿明Ronacher寫了一個模塊codegen它實現了這一點做的ast節點to_source功能。

我還沒有試圖自己做這個。

+0

該codegen模塊不適用於每個Python代碼:( – 2010-06-18 15:23:10

0
import re 

pattern = r'(".+? %")(?= %)' 
oldstr = '"some literal string %" % SOMETHING' 

newstr = re.sub(pattern, r'functioncall(\1)', oldstr) 

嘗試類似的東西。 (當然,儘管有文件I/O)。我還沒有和ast一起工作過,所以我真的不知道如果使用它會比這更容易,但在我看來,如果你我只是在做一個簡單的搜索替換,而實際上並沒有做很多複雜的分析,因此不需要使用ast

相關問題