我有大量的字符串要按以下方式處理。 對於每個字符串,需要提取位置3到15之間的字符,但位置9除外。提取和連接字符串的部分
因此,對於輸入「F01MBBSGB50AGFX0000000000」,輸出將爲「MBBSGB50AGFX」。
顯而易見的方法是s[3:11] + s[12:15]
。
但是,鑑於需要處理的數據量很大,我需要建議的方法來幫助解決這個問題。
我有大量的字符串要按以下方式處理。 對於每個字符串,需要提取位置3到15之間的字符,但位置9除外。提取和連接字符串的部分
因此,對於輸入「F01MBBSGB50AGFX0000000000」,輸出將爲「MBBSGB50AGFX」。
顯而易見的方法是s[3:11] + s[12:15]
。
但是,鑑於需要處理的數據量很大,我需要建議的方法來幫助解決這個問題。
當我有類似的東西,用固定的字符串提取位置時,我喜歡使用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]
以上代碼的其餘部分保持不變。
你需要什麼幫助?字符串切片是這樣做的方式,是的。 – Amber 2013-05-04 05:46:03
你確定Python是這份工作的正確工具嗎? – Blender 2013-05-04 05:46:43
什麼是輸入格式?多少數據?流程運行多久? – Homer6 2013-05-04 05:54:42