按字符数量拆分字符串

31

我无法通过字符串方法完成此操作:

在我的文件中,我有类似于1.012345e0070.123414e-004-0.1234567891.21423... 的东西,这意味着数字之间没有分隔符。

现在,如果我从这个文件中读取一行,我会得到一个像上面那样的字符串,我想在例如12个字符后拆分它。 据我所见,没有任何字符串方法或类似str.split()的任何其他方法可以做到这一点,但也许我忽略了某些东西?

谢谢


1
也许是重复的问题:如何在Python中将列表分成均匀大小的块 - BrainStorm
有趣的是:我在这里放置的答案几乎与我在那里放置的答案一模一样... - Ned Batchelder
8个回答

35

既然你想以一种不寻常的方式进行迭代,那么使用生成器是一个很好的抽象方式:

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个字符的块)


19
你需要查找 字符串切片
>>> x = "1.012345e0070.123414e-004-0.1234567891.21423"
>>> x[2:10]
'012345e0'

8
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

6
您可以像这样做:
step = 12
for i in range(0, len(string), 12):
    slice = string[i:step]
    step += 12

这样,在每次迭代中,您将获得14个字符的一个切片。


3
from itertools import izip_longest

def grouper(n, iterable, padvalue=None):
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

3

在寻找类似问题的解决方案时,我偶然发现了这个 - 然而在我的情况下,我想将字符串拆分成不同长度的块。最终,我使用正则表达式成功解决了问题。

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

奖励

对于那些可能会感兴趣的人 - 我尝试按照特定规则创建伪随机ID,因此这段代码实际上是以下函数的一部分

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

3

我一直觉得,既然字符串可以通过简单的逻辑进行添加操作,那么除法也应该是这样。当被一个数字除时,应该按照这个数字的长度进行分割。所以也许这就是你要找的。

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

2

尝试使用这个函数:

x = "1.012345e0070.123414e-004-0.1234567891.21423"
while len(x)>0:
  v = x[:12]
  print v
  x = x[12:]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接