2016-11-04 5 views
0

Я решил эту проблему с помощью предложения Wiktor Stribiżew.Python regular expression dot character

Отредактировано: Мне нужно только извлечь первый элемент списка за раз, потому что мне нужно выполнить другие операции над этим номером. Я использую цикл в своем коде только для тестирования.

Я хочу разбить арифметическое выражение на список чисел.

Например: 1 + 0,2- (3 в^4) * 5 -> [ '1', '0,2', '3', '4', '5']

Я использую библиотеку повторно в python, но выражение разделяется символом точки. хотя я не включаю '.' в дельтерах.

А именно, когда вход 1 + 0,2, то выходной сигнал будет [ '1', '0', '2'], который должен быть [ '1', '0,2']

Код ниже:

#!/bin/python 
import re 

delims = re.compile(r"[+-/*///^)]") 

while True: 
    string = input() 
    res = list() 
    i = 0 
    while i < len(string): 
     if string[i] >= '0' and string[i] <= '9': 
      num_str = delims.split(string[i:], 1)[0] 
      res.append(num_str) 
      i += len(num_str) - 1 
     i += 1 
    print(res) 

Я действительно ценю любое мнение по этому вопросу!

+1

'-' создает диапазон, избегает его или перемещается в конец/начало класса char, используйте' [- +/* ^)] ' –

+0

[Здесь] (http://stackoverflow.com/questions/32324595/error-in-regex-to-catch-special-characters/32324646 # 32324646) - аналогичный вопрос. –

+0

Спасибо большое! Вы великолепны! –

ответ

0

Причина, по которой ваш подход не работает, заключается в том, что вы создаете диапазон символов с +-/, который содержит точку. Я также думаю, что вы слишком сложны.

import re 
str = '1+0.2-(3^4)*5' 
res = re.split(r'[-+()/*^]+', str) 
print(res) 

выведет ['1', '0.2', '3', '4', '5']

Пожалуйста, обратите внимание, что этот подход не будет обрабатывать отрицательные числа правильно.

+0

Спасибо за уведомление об отрицательных числах! –

0

Используйте следующий подход с re.findall функции:

num_str = '1+0.2-(3^4)*5' 
numbers = re.findall(r'\d(?=[^.]|$)|\d+\.\d+', num_str) 

print(numbers) 

Выход:

['1', '0.2', '3', '4', '5'] 
0

Если вы хотите извлечь только положительные целые числа, попробуйте следующее. Ive предполагается, что были промежутки между simbols и числами:

[int(s) for s in str.split() if s.isdigit()] 

Это лучше, чем регулярное выражение, например, по трем причинам: Вам не нужен другой модуль, Это более удобным для чтения, потому что вам не нужно, чтобы разобрать мини-язык регулярного выражения и Это быстрее.

+0

Вы уверены, что этого достаточно и будете работать? –

+0

Да, это работает, если вы не хотите отличать положительные и отрицательные числа. Я думаю, что это однострочное решение лучше использовать regex и изобретать колесо. –

+1

Даже если числа и символы в строке не разделены пробелом '' ''? –