2013-08-06 73 views
3

我有幾個Python腳本是爲Assessor的辦公室寫的,我在那裏工作。其中大多數要求輸入包裹ID號碼(然後用於通過odbc抓取某些數據)。他們對於如何輸入包裹ID的方式並不一致。Python如何強制一個字符串匹配另一個字符的格式

因此,這裏是我的問題,他們的3種方式之一輸入包裹ID:

1: '1005191000060'

2: '001005191000060'

3:「0010-05- 19-100-006-0'

第三種方法是正確的方法,所以我需要確保輸入固定爲始終匹配該格式。當然,他們寧願在ID中輸入前兩種方式之一。包裹號碼必須總是15位數字(20用破折號)

我目前有一個關於如何修復包裹ID的工作方法,但它非常難看。我想知道是否有人知道更好的方式(或更多的「Pythonic」方式)。我有一個通常被導入到所有這些腳本的函數。以下是我有:

import re 

def FormatPID(in_pid): 
    pid_format = re.compile('\d{4}-\d{2}-\d{2}-\d{3}-\d{3}-\d{1}') 
    pid = in_pid.zfill(15) 
    if not pid_format.match(pid): 
     fixed_pid = '-'.join([pid[:4],pid[4:6],pid[6:8],pid[8:11],pid[11:-1],pid[-1]]) 
     return fixed_pid 
    else: 
     return pid 

if __name__ == '__main__': 

    pid = '1005191000060' 
## pid = '001005191000060' 
## pid = '0010-05-19-100-006-0' 

    # test 
    t = FormatPID(pid) 
    print t 

這樣確實不錯,但我一直在用了一段時間這個醜陋的代碼困擾,我想那裏一定是比它切片一個更好的辦法。我希望有一種方法可以「強制」將其轉換爲字符串以匹配「pid_format」變量。有任何想法嗎?我找不到任何要做到這一點正則表達式模塊中代替手工切片

回答

3

您可以使用itertools.islice

import re 
from itertools import islice 
groups = (4, 2, 2, 3, 3, 1) 
def FormatPID(in_pid): 
    pid_format = re.compile('\d{4}-\d{2}-\d{2}-\d{3}-\d{3}-\d{1}') 
    in_pid = in_pid.zfill(15) 
    if not pid_format.match(in_pid): 
     it = iter(in_pid) 
     return '-'.join(''.join(islice(it, i)) for i in groups) 
    return in_pid 

print FormatPID('1005191000060') 
print FormatPID('001005191000060') 
print FormatPID('0010-05-19-100-006-0') 

輸出:

0010-05-19-100-006-0 
0010-05-19-100-006-0 
0010-05-19-100-006-0 
+0

可愛......我試圖找到一些沿線的東西。我只是看着我正在做的醜陋的切片手術。非常感謝你! – cmackey

4

我不會理會使用正則表達式。你只想得到所有數字,忽略連字符,用0表示左鍵,然後在正確的地方插入連字符,對吧?所以:

def format_pid(pid): 
    p = pid.replace('-', '') 
    if not p.isdigit(): 
     raise ValueError('Invalid format: {}'.format(pid)) 
    p = p.zfill(15) 
    # You can use your `join` call instead of the following if you prefer. 
    # Or Ashwini's islice call. 
    return '{}-{}-{}-{}-{}-{}'.format(p[:4], p[4:6], p[6:8], p[8:11], p[11:14], p[14:]) 
+0

我不認爲他想要做任何填充,(s)他希望他們輸入確切的數字,然後將破折號插入適當的位置。 –

+0

@EricAmorde:如果他不想做任何填充,示例#1將如何工作? – abarnert

+0

啊,我沒有正確閱讀。接得好。 –

相關問題