Python 3 - Как разбить каждый символ в строке в список, сохраняя при этом десятичные числа нетронутыми? - PullRequest
0 голосов
/ 01 ноября 2019
string1 = '1+2*3/4'
string2 = '1 +2* 3 /  4'
string3 = '1.2*2+3/4'

string1List = list(string1)
string2List = list(string2)
string3List = list(string3)

Мне нужно разбить любую строку, которую мне дано, в список, и мне нужно разбить ее по символам, поскольку во введенные строки будут вставлены случайные пробелы, такие как string2 в моем примере кода.

Я получаю желаемый результат с помощью string1 и string2:

string1List = ['1', '+' , '2' , '*' , '3' , '/' , '4' ]
string2List = ['1', ' ' ,' +' , '2' , '*' , ' ' , '3' , ' ' , '/' , ' ' , '4']

, но string3 не работает так, как мне нужно:

# Actual result
string3List = ['1', '.' , '2' , '*' , '2' , '+' , '3' , '/' , '4']

# What I need as a result
string3List = ['1.2', '*' , '2' , '+' , '3' , '/' , '4']

Есть ли способ, который не 't использовать импорт, чтобы продолжить разбиение строк по символам при сохранении чисел с плавающей запятой?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Используйте re.findall с чередованием:

string3 = '1.2*2+3/4'
parts = re.findall(r'\d+(?:\.\d+)?|[+*/-]', string3)
print(parts)

Это печатает:

['1.2', '*', '2', '+', '3', '/', '4']

На других языках мы могли бы попытаться разделить регулярные выражения по поисковым системам. Но Python re.split не поддерживает разбиение на обходы нулевой ширины, поэтому re.findall - это один из обходных путей.

1 голос
/ 01 ноября 2019

Пользовательское разбиение за один проход арифметическими операциями:)

string = '1.2*2+3/4'

s = 0
res = []
for i in range(len(string)) :
  if string[i] in '+*-/': 
     res.extend([string[s:i], string[i]])
     s = i+1
res.append(string[s:])
print(res) # ['1.2', '*', '2', '+', '3', '/', '4']
...