Разделить строку по количеству символов - PullRequest
21 голосов
/ 18 августа 2011

Я не могу понять, как это сделать с помощью строковых методов:

В моем файле есть что-то вроде 1.012345e0070.123414e-004-0.1234567891.21423 ... что означает, что между числами нет разделителя.

Теперь, если я читаю строку из этого файла, я получаю строку, подобную приведенной выше, которую я хочу разделить после, например, 12 символов. Насколько я знаю, нет способа сделать это с помощью str.split() или любого другого строкового метода, но, может быть, я что-то упускаю?

Thx

Ответы [ 8 ]

23 голосов
/ 18 августа 2011

Поскольку вы хотите выполнять итерации необычным образом, генератор - это хороший способ абстрагироваться от того, что:

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-символьные куски)

12 голосов
/ 18 августа 2011

Вы ищете нарезка строк.

>>> x = "1.012345e0070.123414e-004-0.1234567891.21423"
>>> x[2:10]
'012345e0'
4 голосов
/ 18 августа 2011
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
3 голосов
/ 18 августа 2011
from itertools import izip_longest

def grouper(n, iterable, padvalue=None):
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
2 голосов
/ 18 августа 2011

вы можете сделать это следующим образом:

step = 12
for i in range(0, len(string), 12):
    slice = string[i:step]
    step += 12

таким образом на каждой итерации вы получите один фрагмент из 14 символов.

1 голос
/ 07 апреля 2017

Я всегда думал, так как операция добавления строки возможна по простой логике, возможно, деление должно быть таким.При делении на число оно должно делиться на эту длину.Может быть, это то, что вы ищете.

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']

Если вы не хотите создавать совершенно новый класс, просто используйте эту функцию, которая переопределяет ядро ​​приведенного выше кода,

>>> def string_divide(string, div):
       l = []
       for i in range(0, len(string), div):
           l.append(string[i:i+div])
       return l

>>> string_divide('abcdefghijklmnopqrstuvwxyz', 15)
['abcdefghijklmno', 'pqrstuvwxyz']
1 голос
/ 05 декабря 2016

Я наткнулся на это, когда искал решение для подобной проблемы - но в моем случае я хотел разбить строку на куски различной длины.В конце концов я решил это с помощью 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])
1 голос
/ 18 августа 2011

Попробуйте эту функцию:

x = "1.012345e0070.123414e-004-0.1234567891.21423"
while len(x)>0:
  v = x[:12]
  print v
  x = x[12:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...