2016-05-14 2 views
1

Страшный человеку дал мне строку, как этогорасщепление unspaced строки десятичных значений - Python

values = '.850000.900000.9500001.000001.50000' 

и мне нужно разбить его, чтобы создать следующий список:

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

Я знаю, что я имел дело только с числами < 1 я мог бы использовать код

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

Но в тех случаях, как этот, где есть число больше 1, захороненные в строке, splitvalue бы в конечном итоге

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

Так есть ли способ, чтобы разбить строку с несколькими разделителями, а также разделения строки по-разному, на основании которых разделитель столкнулись?

+0

Все ли цифры заканчиваются на 0 или есть какой-то способ узнать, когда заканчивается номер? –

+1

Правильно ли это третье число в строке или вы вводили слишком много цифр? –

+4

Невозможно узнать, с чего начать и завершить расщепление. Например, '0.850000.900000' =' [0.85, 0.9] 'или' [0.8, 50000.9] '? –

ответ

1
>>> import re 
>>> source = '0.850000.900000.9500001.000001.50000' 

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

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

Разбивка основана на поиске «{ничего, двойной нуль, пробег нулей (с последующим ненулевым)"}.

+1

Это отлично работает. Я был уверен, что мне придется использовать сложное понимание списка с помощью ors и nots. – jmdeamer

1

Предположим, что значение перед десятичной меньше 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'] 
2

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

import re 

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

Повторите попытку на оставшейся строке, чтобы использовать все числа.

+0

'AttributeError: 'module' объект не имеет атрибута 'find'' – SparkAndShine

1

С фиксированной/переменной строки, вы можете попробовать что-то вроде:

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 

Output:

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

Assuming that there will always be a single digit before the decimal.

Please take this as a starting point and not a copy paste solution.

1

Как об использовании 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'] 
1

Здесь цифры имеют фиксированную ширину, то есть 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 
Смежные вопросы