【问题标题】:Splitting an unspaced string of decimal values - Python拆分无空格的十进制值字符串 - Python
【发布时间】:2016-05-14 03:42:48
【问题描述】:

一个可怕的人给了我这样的字符串

values = '.850000.900000.9500001.000001.50000'

我需要拆分它以创建以下列表:

['.850000', '.900000', '.950000', '1.00000', '1.500000']

我知道我只处理数字

dl = '.' 
splitvalues = [dl+e for e in values.split(dl) if e != ""]

但是在这种情况下,字符串中包含大于 1 的数字,splitvalue 最终会是

['.850000', '.900000', '.9500001', '.000001', '.50000']

那么有没有办法用多个分隔符拆分字符串,同时根据遇到的分隔符对字符串进行不同的拆分?

【问题讨论】:

  • 所有数字都以 0 结尾还是有什么方法可以知道数字何时结束?
  • 字符串中的第三个数字是否正确,或者您输入的数字是否过多?
  • 没有办法知道从哪里开始和结束拆分。例如是0.850000.900000 = [0.85, 0.9][0.8, 50000.9]?
  • 你的笔误。它应该是'.860000'0.850000 之一。
  • 您的问题中的另一个错误。您的代码的结果是['.0', '.850000', '.900000', '.9500001', '.000001', '.50000']

标签: python string list split delimiter


【解决方案1】:

我认为这有点接近固定宽度的格式字符串。试试这样的正则表达式:

import re

str = "(\d{1,2}\\.\d{5})"
m = re.search(str, input_str)
your_first_number = m.group(0)

在剩余的字符串上重复此操作以消耗所有数字。

【讨论】:

  • AttributeError: 'module' object has no attribute 'find'
【解决方案2】:
>>> import re
>>> source = '0.850000.900000.9500001.000001.50000'

>>> re.findall("(.*?00+(?!=0))", source)

['0.850000', '.900000', '.950000', '1.00000', '1.50000']

拆分是基于寻找“{anything, double zero, a run of zeros (following by a not-zero)”}。

【讨论】:

  • 这很好用。我确信我将不得不对 ors 和 nots 使用复杂的列表理解。
【解决方案3】:

假设小数点前的值小于10,那么我们有,

values = '0.850000.900000.9500001.000001.50000'

result = list()
last_digit = None 

for value in values.split('.'):
    if value.endswith('0'):
        result.append(''.join([i for i in [last_digit, '.', value] if i]))
        last_digit = None
    else:
        result.append(''.join([i for i in [last_digit, '.', value[0:-1]] if i]))
        last_digit = value[-1]

if values.startswith('0'):
    result = result[1:]

print(result)
# Output
['.850000', '.900000', '.950000', '1.00000', '1.50000']

【讨论】:

    【解决方案4】:

    re.split()怎么样:

    import re
    
    values = '0.850000.900000.9500001.000001.50000'
    
    print([a + b for a, b in zip(*(lambda x: (x[1::2], x[2::2]))(re.split(r"(\d\.)", values)))])
    

    输出

    ['0.85000', '0.90000', '0.950000', '1.00000', '1.50000']
    

    【讨论】:

      【解决方案5】:

      这里的数字是固定宽度的,即 6,如果包括点它是 7。获取从 0 到 7 和 7 到 14 的切片,依此类推。因为我们不需要初始零,所以我使用切片values[1:] 进行提取。

      values = '0.850000.900000.9500001.000001.50000'
      [values[1:][start:start+7] for start in range(0,len(values[1:]),7)]
      ['.850000', '.900000', '.950000', '1.00000', '1.50000']
      

      测试;

      ''.join([values[1:][start:start+7] for start in range(0,len(values[1:]),7)]) == values[1:]
      True
      

      【讨论】:

        【解决方案6】:

        使用固定/可变字符串,您可以尝试以下操作:

        values = '0.850000.900000.9500001.000001.50000'
        str_list = []
        
        first_index = values.find('.')
        while first_index > 0:
            last_index = values.find('.', first_index + 1)
            if last_index != -1:
                str_list.append(values[first_index - 1: last_index - 2])
                first_index = last_index
            else:
                str_list.append(values[first_index - 1: len(values) - 1])
                break
        print str_list
        

        输出:

        ['0.8500', '0.9000', '0.95000', '1.0000', '1.5000']

        假设小数点前总是有一个数字。

        请以此为起点,而不是复制粘贴解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多