2013-05-04 46 views
0

我有大量的字符串要按以下方式處理。 對於每個字符串,需要提取位置3到15之間的字符,但位置9除外。提取和連接字符串的部分

因此,對於輸入「F01MBBSGB50AGFX0000000000」,輸出將爲「MBBSGB50AGFX」。

顯而易見的方法是s[3:11] + s[12:15]
但是,鑑於需要處理的數據量很大,我需要建議的方法來幫助解決這個問題。

+6

你需要什麼幫助?字符串切片是這樣做的方式,是的。 – Amber 2013-05-04 05:46:03

+0

你確定Python是這份工作的正確工具嗎? – Blender 2013-05-04 05:46:43

+0

什麼是輸入格式?多少數據?流程運行多久? – Homer6 2013-05-04 05:54:42

回答

1

當我有類似的東西,用固定的字符串提取位置時,我喜歡使用Python切片來預定義要提取的感興趣的字段。這可能有點矯枉過正,但它將所有的現場位置和長度計數信息保存在一個簡單易於管理的數據結構中,而不是通過代碼遍歷[2:10],[12:15]等。

#   1   2 
#123456789
samples = """\ 
F01MBBSGB50AGFX0000000000 
F01MBCSGB60AGFX0000000000 
F01MBDSGB70AGFX0000000000""".splitlines() 

# define the different slices you want to get from each line; 
# can be arbitrarily many, can extend beyond the length of the 
# input lines, can include 'None' to imply 0 as a start or 
# end-of-string as the end 
indexes = [(3,9),(10,15)] 

# convert to Python slices using 'slice' builtin 
slices = [slice(*idx) for idx in indexes] 

# make a marker to show slices that will be pulled out 
# (assumes slices don't overlap, and no Nones) 
marker = '' 
off = 0 
for idx in sorted(indexes): 
    marker += ' '*(idx[0]-off) + '^'*(idx[1]-idx[0]) 
    off = idx[1] 

# extract and concat 
for s in samples: 
    print s 
    print marker 
    print ''.join(s[slc] for slc in slices) 
    print 

打印:

F01MBBSGB50AGFX0000000000 
    ^^^^^^ ^^^^^ 
MBBSGB0AGFX 

F01MBCSGB60AGFX0000000000 
    ^^^^^^ ^^^^^ 
MBCSGB0AGFX 

F01MBDSGB70AGFX0000000000 
    ^^^^^^ ^^^^^ 
MBDSGB0AGFX 

如果你願意,你還可以定義片使用(start,length)元組,如

fields = [(3,6), (10,5)] 

然後將這些轉換成片,用提取:

slices = [slice(start,start+length) for start,length in fields] 

以上代碼的其餘部分保持不變。

+0

愛異常樣式標記! – 2013-05-04 08:23:36

+0

這可能是'operator.itemgetter(* slices)(s)' – jfs 2013-05-04 13:03:31

+0

@ J.F.Sebastian - 很好! – PaulMcG 2013-05-06 13:14:00