Разделить строку в списке меток / значений с разными разделителями и содержимым значений - PullRequest
1 голос
/ 04 апреля 2019

У меня есть строка со списком переменных / значений, например.

string = " var1 = 20, var2  = hello    var3 =345.34  var4 = I have lost 
2,5 billions, var5 = Bill"

разделение кортежей может быть "," или любым количеством пробелов, идентификация кортежей всегда "=" вызов - это некоторые значения, содержащие описательную строку с запятыми в качестве разделителя тысяч илинаихудший как разделитель цифр.

Я попытался с последовательностью re.sub и re.findall с регулярным выражением python, но я не могу правильно разделить кортеж var4, ниже кода:

import re
string = " var1 = 20, var2  = hello    var3 =345.34  var4 = I lost 2,5 
billions, var5 = Bill"

t = re.sub('(\=\s+)', '=', string)
t = re.sub('(\s+\=)', '=', t)
result = re.findall("[A-Za-z0-9(,)\=\.]+", t)

print(result)
['var1=20,', 'var2=hello', 'var3=345.34', 'var4=I', 'lost', '2,5', 
'billions,', 'var5=Bill']

Мой ожидаемый результат

['var1=20', 'var2=hello', 'var3=345.34', 'var4=I lost 2,5 billions', 'var5=Bill']

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Если каждый элемент, который вы хотите извлечь, начинается с var, вы можете использовать этот факт следующим образом:

import re
string = " var1 = 20, var2  = hello    var3 =345.34  var4 = I have lost 2,5 billions, var5 = Bill"
vars = re.findall(r'var.*?(?=var|$)',string)
print(vars) # ['var1 = 20, ', 'var2  = hello    ', 'var3 =345.34  ', 'var4 = I have lost 2,5 billions, ', 'var5 = Bill']

Я использовал так называемый положительный прогноз (вид утверждения нулевой длины), поэтому findall ищет подстроки, за которыми следует var или конец str ($).Как видите, str s внутри vars все еще нуждается в некоторой чистке.Сначала удалите завершающие пробелы:

vars = [i.strip(' ') for i in vars]
print(vars) # ['var1 = 20,', 'var2  = hello', 'var3 =345.34', 'var4 = I have lost 2,5 billions,', 'var5 = Bill']

Теперь ваш пример для меня неясен - я не знаю, хотите ли вы сохранить конечные , s как в var1 = 20, или удалить его как в var4=I lost 2,5 billions -поэтому я сохраняю , s, поскольку они отмечают, что они могут быть удалены таким же образом, как показано для пробелов.Наконец, чтобы удалить пробелы вокруг =, вы можете использовать re.sub следующим образом:

vars = [re.sub(r' *= *','=',i,1) for i in vars]
print(vars) #['var1=20,', 'var2=hello', 'var3=345.34', 'var4=I have lost 2,5 billions,', 'var5=Bill']

Обратите внимание, что 1 в re.sub является преднамеренным, поэтому произойдет только замена 1 - так будетвыбрасывать пробелы только вокруг первых = в каждом элементе vars.Вы можете отбросить это 1, если уверены, что в каждом элементе содержится не более 1 =.

3 голосов
/ 04 апреля 2019

Вы можете использовать

re.split(r',?\s+(?=\w+=)', re.sub(r'\s*=\s*', '=', s.strip()))

. re.sub(r'\s*=\s*', '=', s.strip()) удалит пробелы вокруг = после удаления начальных / конечных пробелов в строке, а r',?\s+(?=\w+=)' с re.split будет разбивать строку по желанию.запятая, затем 1 или более пробелов, за которыми следуют 1+ слов, а затем =.

См. Python demo :

import re
s = " var1 = 20, var2  = hello    var3 =345.34  var4 = I lost 2,5 billions, var5 = Bill"
result = re.split(r",?\s+(?=\w+=)", re.sub(r'\s*=\s*', '=', s.strip()))
print(result)
# => ['var1=20', 'var2=hello', 'var3=345.34', 'var4=I lost 2,5 billions', 'var5=Bill']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...