2016-10-29 80 views
0

我已經在stackoverflow和google上搜索了很多關於它的問題。但是沒有一個解決了我的問題。使用列表範圍的Python格式化字符串

比方說,我有一個不規則長度的字符串(如電話號碼或特定和領土文檔),例如:

docA="A123B456" 
docB="A123B456CD" 
docC="6CD" 

我書面方式一個函數來打印文檔。但他們沒有明確的模式,我的方法是使用最常見模式的默認變量,並向程序員提供角落案件的責任。 如:

def printDoc(text, pattern="{}{}{}{}#{}{}{}-{}") 
    print(pattern.format(*text)) 

但是,如果有一種方法來簡化像

def printDoc(text, pattern="{0:3}#{4:-1}-{-1}") 
    print(pattern.format(*text)) 

然後,該圖形我可以用它喜歡它會更乾淨和明確:

printDoc(docA) 
printDoc(docB) 
printDoc(docC, "{0:1}-{2}") 

但這不是一個有效的語法。有一種正確的做法嗎?

如果我的方法是錯誤的,我將不勝感激知道這樣做的更好方法。

感謝

回答

0

你可以使用正則表達式從格式字符串解析索引/片,並使用這些給定指標文本。在與str.format一起使用之前,您還必須從格式字符串中刪除這些字符。唯一棘手的部分實際上是從text越來越格式參數了,但如果你考慮eval接受你能做到以下幾點:

import re 

def printDoc(text, pattern="{0:3}#{4:-1}-{-1}"): 
    params = [] 

    # Find occurrences of '{}' from format string and extract format parameter 
    for m in re.finditer(r'\{([-:\d]+)\}', pattern): 
     params.append(eval('text[{}]'.format(m.group(1)))) 

    # Remove indeces from format string 
    pattern = re.sub(r'\{([-:\d]+)\}', '{}', pattern) 
    print(pattern.format(*params)) 

printDoc('A123B456') 

輸出:

A12#B45-6 

注意,使用eval通常被認爲bad and unsafe practice。儘管由於eval的字符集限制,潛在風險有限,但您可能需要考慮其他選擇,除非您是控制格式字符串的人員。

+0

感謝您對此事發表評論,但我不能使用eval =( –

+0

@EricLopes你可以仍然使用相同的原則與'regex',抓住一個或兩個號碼,然後使用這些索引/片'text'。 – niemmi

相關問題