2013-05-04 3 views
0

У меня есть огромное количество строк для обработки следующим образом. Для каждой строки необходимо извлечь символы с позиции 3 по 15, кроме позиции 9.извлечение и конкатенация частей строки

Итак, для ввода «F01MBBSGB50AGFX0000000000» выход будет «MBBSGB50AGFX».

Очевидным способом является s[3:11] + s[12:15].
Но учитывая абсолютную величину данных, которые необходимо обработать, мне нужна помощь по рекомендованному способу сделать это.

+6

С чем вам нужна помощь? String slicing - это способ сделать это, да. – Amber

+0

Вы уверены, что Python является правильным инструментом для этой работы? – Blender

+0

Что такое формат ввода? Сколько данных? Как долго может работать процесс? – Homer6

ответ

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

Любите маркеры стиля исключения! –

+0

Это может быть подходящий случай для 'operator.itemgetter (* slices) (s)' – jfs

+0

@ J.F.Sebastian - хорошо! – PaulMcG

Смежные вопросы