2013-07-31 69 views
3

我試圖拿起蟒蛇和有人從Javascript未來我還沒有真正能夠理解python的正則表達式包重新的Python相當於與string.replace(從Javascript)

我所試圖做的是什麼我在JavaScript中完成建立一個非常非常簡單的模板「引擎」(我的理解AST是去什麼更復雜的方式):

在javascript中:

var rawString = 
    "{{prefix_HelloWorld}} testing this. {{_thiswillNotMatch}} \ 
    {{prefix_Okay}}"; 

rawString.replace(
    /\{\{prefix_(.+?)\}\}/g, 
    function(match, innerCapture){ 
    return "One To Rule All"; 
}); 

在Javascript中,這將導致:

「一個規則所有測試這個。 {{_thiswillNotMatch}}一個要 規則全部」

和作用會得到一個名爲兩次:

innerCapture === "HelloWorld" 
    match ==== "{{prefix_HelloWorld}}" 

和:現在

innerCapture === "Okay" 
    match ==== "{{prefix_Okay}}" 

,在python我試圖尋找up docs on the re package

import re 

已經嘗試做一些沿線的事情:

match = re.search(r'pattern', string) 
if match: 
    print match.group() 
    print match.group(1) 

但它對我來說真的沒有意義,並且不起作用。首先,我不清楚這個group()概念是什麼意思?我怎麼知道是否有match.group(n)... group(n + 11000)?

謝謝!

回答

5

Python的re.sub功能就像JavaScript的String.prototype.replace

import re 

def replacer(match): 
    return match.group(1).upper() 

rawString = "{{prefix_HelloWorld}} testing this. {{_thiswillNotMatch}} {{prefix_Okay}}" 
result = re.sub(r'\{\{prefix_(.+?)\}\}', replacer, rawString) 

而結果:

'HELLOWORLD testing this. {{_thiswillNotMatch}} OKAY' 

至於組,發現你的替換功能如何接受match參數和innerCapture說法。第一個參數是match.group(0)。第二個是match.group(1)

+0

謝謝你,讓有很大的意義。第2,3組等等是什麼?還是那些沒有定義的。 –

+0

@JohnTomson:'.group(n)'是第n個捕獲組。 – Blender

0

我想你想替換所有出現的{{prefix_ *}}其中*基本上是任何東西。如果是這樣,這個代碼的工作原理很簡單。

pattern = "\{\{prefix_.*?\}\}" 
re.sub(pattern, "One To Rule All", rawString) 

乾杯!

0

如果您將使用相同的模式不止一次(如在一個循環),那麼這是更好的:

pattern = re.compile("\{\{prefix_.*?\}\}") 
# ... later ... 
pattern.sub("One To Rule All", rawString)