【问题标题】:Split string by count of characters按字符数拆分字符串
【发布时间】:2011-08-18 16:47:07
【问题描述】:

我不知道如何用字符串方法做到这一点:

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

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

谢谢

【问题讨论】:

标签: python string


【解决方案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 个字符的块)

【讨论】:

    【解决方案2】:

    您正在寻找string slicing.

    >>> x = "1.012345e0070.123414e-004-0.1234567891.21423"
    >>> x[2:10]
    '012345e0'
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

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

      以这种方式,在每次迭代中,您将获得一个包含 14 个字符的切片。

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

          【解决方案5】:

          我在寻找类似问题的解决方案时偶然发现了这一点 - 但就我而言,我想将字符串拆分成不同长度的块。最终我用 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')]
          

          奖金

          对于那些可能觉得有趣的人 - 我尝试通过特定规则创建伪随机 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])
          

          【讨论】:

            【解决方案6】:

            我一直认为,既然通过简单的逻辑就可以进行字符串加法运算,那么除法应该是这样的。当除以一个数字时,它应该除以那个长度。所以可能这就是你要找的。

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

            【讨论】:

              【解决方案7】:

              试试这个功能:

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

              【讨论】:

                【解决方案8】:
                from itertools import izip_longest
                
                def grouper(n, iterable, padvalue=None):
                    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-04-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-12-08
                  • 1970-01-01
                  相关资源
                  最近更新 更多