我无法通过字符串方法完成此操作:
在我的文件中,我有类似于1.012345e0070.123414e-004-0.1234567891.21423... 的东西,这意味着数字之间没有分隔符。
现在,如果我从这个文件中读取一行,我会得到一个像上面那样的字符串,我想在例如12个字符后拆分它。
据我所见,没有任何字符串方法或类似str.split()
的任何其他方法可以做到这一点,但也许我忽略了某些东西?
谢谢
我无法通过字符串方法完成此操作:
在我的文件中,我有类似于1.012345e0070.123414e-004-0.1234567891.21423... 的东西,这意味着数字之间没有分隔符。
现在,如果我从这个文件中读取一行,我会得到一个像上面那样的字符串,我想在例如12个字符后拆分它。
据我所见,没有任何字符串方法或类似str.split()
的任何其他方法可以做到这一点,但也许我忽略了某些东西?
谢谢
既然你想以一种不寻常的方式进行迭代,那么使用生成器是一个很好的抽象方式:
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个字符的块)
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
step = 12
for i in range(0, len(string), 12):
slice = string[i:step]
step += 12
这样,在每次迭代中,您将获得14个字符的一个切片。
from itertools import izip_longest
def grouper(n, iterable, padvalue=None):
return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
在寻找类似问题的解决方案时,我偶然发现了这个 - 然而在我的情况下,我想将字符串拆分成不同长度的块。最终,我使用正则表达式成功解决了问题。
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])
我一直觉得,既然字符串可以通过简单的逻辑进行添加操作,那么除法也应该是这样。当被一个数字除时,应该按照这个数字的长度进行分割。所以也许这就是你要找的。
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']
尝试使用这个函数:
x = "1.012345e0070.123414e-004-0.1234567891.21423"
while len(x)>0:
v = x[:12]
print v
x = x[12:]