2017-07-20 55 views
0

考慮類似printf函數的format參數。喜歡的東西:正則表達式 - 格式字符串中的捕獲類型說明符

printf("Hello %s, your rating is %i%%", name, percentage); 

我想用正則表達式來捕獲所有類型說明符(在上述情況下,%s%i而不是%%)。

我已經開始使用天真的(%[^%])模式,但它錯誤地捕獲了諸如%%f之類的內容,而不是「轉義」它。當然,%%%f應該被解釋爲一個轉義的「%」,然後是一個說明符。

我想我需要一些更復雜的模式(可能是後面看?),但無法整理出來。有什麼建議麼?注:我知道我的模式不處理長度說明符和其他格式標誌,如%2f等,但這對我來說很好,因爲我的目標主要是枚舉和計數格式說明符。

+0

也許你需要指定更多你的意圖是什麼。你爲什麼做這個?你需要使用正則表達式,還是你可以做一些字符串解析(例如找到並移除轉義字符)? – Derek

+0

最終,目標是在'printf','sprintf','NSLog'等編寫一組方便的包裝函數,它們替換錯誤的說明符,處理objc對象描述格式等等。我可以手動迭代char數組,並標記格式字符串,但是正則表達式會使代碼更清晰。 – Elist

+0

我在想手動迭代可能會變成更乾淨更好的選項。我不是一個正則表達式嚮導,但我沒事。如果它需要由正則表達式嚮導編寫,那麼它可能會讓事情比你想要的更復雜。 – Derek

回答

1

一方面,你不能沒有意外捕之類的東西%%f跳躍的字符,所以你必須要麼使用match或放^(尖)在正則表達式的開始。另一方面,在這種情況下,您不能使用findall。由於沒有matchall功能,最簡單的將是寫自己的循環:

REG = re.compile('([^%]|%%)*(%[^%])') # a bunch of (non-% or %%), and then (% followed by non-%). 
def find_type_specifiers(st): 
    retval = [] 
    pos = 0 # where to start searching for next time 
    while True: 
     match = REG.match(st, pos) 
     if match is None: 
      return retval 
     retval.append(match.group(2)) 
     pos = match.end() 

當然,你可以改變你追加到retval如果如什麼你也對分類符的位置感興趣。或者如果您只想要金額,請更改爲櫃檯。

相關問題