Разделить строку по количеству символов
Я не могу понять, как это сделать со строковыми методами:
В моем файле у меня есть что-то вроде 1.012345e0070.123414e-004-0.1234567891.21423... что означает, что между цифрами нет разделителя.
Теперь, если я прочитал строку из этого файла, я получу строку, как указано выше, которую я хочу разбить, например, 12 символов.
Невозможно сделать это с помощью чего-то вроде str.split()
или любого другого строкового метода, насколько я видел, но, возможно, я что-то пропускаю?
спасибо
Ответы
Ответ 1
Поскольку вы хотите итерации необычным способом, генератор - хороший способ абстрагировать это:
def chunks(s, n):
"""Produce `n`-character chunks from `s`."""
for start in range(0, len(s), n):
yield s[start:start+n]
nums = "1.012345e0070.123414e-004-0.1234567891.21423"
for chunk in chunks(nums, 12):
print chunk
дает:
1.012345e007
0.123414e-00
4-0.12345678
91.21423
(который выглядит не так, но это 12- char куски)
Ответ 2
Вы ищете строковое нарезка.
>>> x = "1.012345e0070.123414e-004-0.1234567891.21423"
>>> x[2:10]
'012345e0'
Ответ 3
line = "1.012345e0070.123414e-004-0.1234567891.21423"
firstNumber = line[:12]
restOfLine = line[12:]
print firstNumber
print restOfLine
Выход
1.012345e007
0.123414e-004-0.1234567891.21423
Ответ 4
Попробуйте эту функцию:
x = "1.012345e0070.123414e-004-0.1234567891.21423"
while len(x)>0:
v = x[:12]
print v
x = x[12:]
Ответ 5
from itertools import izip_longest
def grouper(n, iterable, padvalue=None):
return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
Ответ 6
вы можете сделать это следующим образом:
step = 12
for i in range(0, len(string), 12):
slice = string[i:step]
step += 12
таким образом на каждой итерации вы получите один фрагмент из 14 символов.
Ответ 7
Я наткнулся на это, ища решение для подобной проблемы, но в моем случае я хотел разделить строку на куски разной длины. В конце концов я решил это с помощью RE
In [13]: import re
In [14]: random_val = '07eb8010e539e2621cb100e4f33a2ff9'
In [15]: dashmap=(8, 4, 4, 4, 12)
In [16]: re.findall(''.join('(\S{{{}}})'.format(l) for l in dashmap), random_val)
Out[16]: [('07eb8010', 'e539', 'e262', '1cb1', '00e4f33a2ff9')]
Bonus
Для тех, кто может показаться интересным - я попытался создать псевдослучайный идентификатор по определенным правилам, поэтому этот код фактически является частью следующей функции
import re, time, random
def random_id_from_time_hash(dashmap=(8, 4, 4, 4, 12)):
random_val = ''
while len(random_val) < sum(dashmap):
random_val += '{:016x}'.format(hash(time.time() * random.randint(1, 1000)))
return '-'.join(re.findall(''.join('(\S{{{}}})'.format(l) for l in dashmap), random_val)[0])
Ответ 8
Я всегда думал, так как операция сложения строк возможна с помощью простой логики, может быть, разделение должно быть таким. Когда делится на число, он должен делиться на эту длину. Так может быть, это то, что вы ищете.
class MyString:
def __init__(self, string):
self.string = string
def __div__(self, div):
l = []
for i in range(0, len(self.string), div):
l.append(self.string[i:i+div])
return l
>>> m = MyString(s)
>>> m/3
['abc', 'bdb', 'fbf', 'bfb']
>>> m = MyString('abcd')
>>> m/3
['abc', 'd']