2017-02-23 49 views
-1

我真的很感激你的時間。Python將多個捕獲的REGEX匹配傳遞給函數

我成功地捕獲了一些指定爲* code *的分隔符標籤之間的文本。我有多個IE:*代碼*代碼在這裏#1 *代碼*然後*代碼*代碼在這裏#2 *代碼*。我很努力地將REGEX捕獲的代碼在* code *標記之間傳遞給我的類進行格式化。它一遍又一遍地顯示爲「代碼#1」。

The input text is: 

*image1* 
Some More Text here 

That's a title pic and there are 2 more enable pictures per page. 
*code* CENTER CODES HERE *code* Those can be a bit larger. And then  there is more 
code to show *code* MORE CENTER CODE *code* 

Paragraph Test 

這裏是我已經捕獲文本,然後遍歷:

replace = CodeboxReplace() 
    codeboxRE = re.compile('\*code\*(.*?)\*code\*') 
    found = codeboxRE.findall(thisText) 
    for item in found: 
     thisText = codeboxRE.sub(replace(item), thisText) 

確定,那麼類CodeboxReplace()看起來像這樣{CODEHERE}是我在的地方標記被替換實際代碼這是在代碼分隔符之間的匹配:

class CodeboxReplace(object): 
def __init__(self): 
    self.counter = 0 

def __call__(self, match): 
    self.counter += 1 
    .......some not relevant code here................ 
    codeHereRE = re.compile('{CODEHERE}') 
    found = codeHereRE.findall(myCode) 
    for item in found: 
     myCode = codeHereRE.sub(match, myCode) 
    return myCode 

所以,從根本上我想T的捕獲的代碼片段他用分隔符代替{CODEHERE}。但是每場比賽總是隻使用REGEX的第一次捕捉。

幫助!謝謝!如果你想看到它呈現怎樣看

http://www.americantechnocracy.com/getArticle

最好的問候, 湯姆

+1

這是不是一個真正的[MCVE(https://stackoverflow.com/help/mcve)。您正在省略可能會顯示您想要的代碼的部分內容。我認爲你需要捕獲第一個匹配'* code *(...)* code *'的匹配項,並用它來代替班級中不同文本中第一次出現的「{CODEHERE}」。這是真的? –

回答

1

正則表達式對象的方法,取代所有不重疊,occurrances的模式。因此,第一次執行時:

myCode = codeHereRE.sub(match, myCode) 

它取代了所有「{CODEHERE}」的發生。如果你只是想更換1個occurrance,然後用計數參數

myCode = codeHereRE.sub(match, myCode, count=1) 
+0

謝謝!你沒錯 - count = 1確實解決了這個問題。我不得不把它放在調用re.sub中,儘管... ie:thisText = codeboxRE.sub(replace(item),thisText,count = 1)解決了這個問題。在實際的替換函數中放置count = 1並不會有幫助,因爲多個標記替換正在發生在更高級別的匹配中......但是,BIG BIG BIG HELP非常感謝這麼多 –