LINUX.ORG.RU

python разбивка строк


1

1

Есть массив строк, надо каждую строку разделить на несколько частей известной заранее длины.

Например,

VISA CLASSIC        06ИЮЛ 08ИЮЛ14 xxxxxx NESTE AZS 512          RUR           79.00       79.00

надо разделить на «VISA CLASSIC», «06ИЮЛ», «08ИЮЛ14», «xxxxxx», «NESTE AZS 512», «RUR», «79.00», «79.00»

содержимое первого и пятого столбца может быть разным и включать в себя сколько угодно пробелов, но текст отформатирован, так что всё идет ровными столбцами.

Есть вариант перевести строку в массив и навелосипедить, но вдруг уже все готово?

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 1)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

_line = u"VISA CLASSIC        06ИЮЛ 08ИЮЛ14 xxxxxx NESTE AZS 512          RUR           79.00       79.00"

def split_fields(line, field_sizes, delim_size=0, strip=False):
    offset = 0
    for size in field_sizes:
        field = line[offset : offset + size]
        yield field.strip() if strip else field
        offset += size + delim_size

if __name__ == '__main__':
    for field in split_fields(_line, [19, 5, 7, 6, 5, 3, 12, 13, 11, 5], delim_size=1, strip=True):
        print "'" + field + "'"
theNamelessOne ★★★★★
()
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import re

line = u'VISA CLASSIC        06ИЮЛ 08ИЮЛ14 xxxxxx NESTE AZS 512          RUR           79.00       79.00'

r = re.compile(' * '.join(['([^ ].{1,%i}[^ ])' % (i-2) for i in [19,5,7,6,22,14,12,20]]))
m = re.match(r, line)
if m:
    for i in range(9):
        print('%i: >%s<' % (i, m.group(i)))
anonymous
()
Ответ на: комментарий от cvs-255

Нет, тип какой, str или unicode? В unicode идёт в символах, но utf8 к нему никаким боком не относится. Можешь считать символы, из которых состоит строка unicode, объектами.

Ttt ☆☆☆☆☆
()
Последнее исправление: Ttt (всего исправлений: 1)

То ли у нас тут охренительные знатоки Python, то ли я не понял задачу, но:

>>> x="VISA CLASSIC        06ИЮЛ 08ИЮЛ14 xxxxxx NESTE AZS 512          RUR           79.00       79.00"
>>> print x.split()
['VISA', 'CLASSIC', '06\xd0\x98\xd0\xae\xd0\x9b', '08\xd0\x98\xd0\xae\xd0\x9b14', 'xxxxxx', 'NESTE', 'AZS', '512', 'RUR', '79.00', '79.00']
>>>
tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

надо разделить на «VISA CLASSIC»

['VISA', 'CLASSIC',

anonymous
()
Ответ на: комментарий от Ttt

Если на входе - запись фиксированного размера, то и нужно выбирать по фиксированным смещениям: x[0:12], x[20:39] и т.д.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну это я понимаю, только судя по всему, ТС такое решение считает велосипедом :) Или может я не совсем допонимаю, может там не все столбцы одинаковой длины.

Ttt ☆☆☆☆☆
()
Ответ на: комментарий от Ttt

Нет, именно так и надо было. Только долго тупил из-за недостаточного знания python. [x1:x2] давало сбой из-за utf8. после перевода в юникод стало работать без проблем.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от Ttt

А если какой китайский символ попадется, что Эдик делать будет? Хотя в данном конкретном примере ему неоткуда быть

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от cvs-255

А если какой китайский символ попадется, что Эдик делать будет?

А я, вообще-то, русский. И кроме английского иностранных языков не знаю. На кой хрен мне кетайщина?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от cvs-255

тогда он залезет под одеяло, и никакого ненужного китайского не станет

anonymous
()
Ответ на: комментарий от Eddy_Em

в bash я умею еще меньше, чем в питон

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Я — не китаец, нафиг они мне нужны эти китайские символы?

в bash я умею еще меньше, чем в питон

А зря. Баш — штука полезная, в отличие от пхытона.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.