Hi,
The response from a web form fills an array. Its content may average from empty to several strings.
I need to extract data from said strings so I can work with it.
I came out with the following code but I'm sure it can be improved.
I appreciate some opinion/improvement.
TIA
import re
soil1 = 0
soil2 = 0
checkbox1 = 0
checkbox2 = 0
para_array = ['s1=2.67', 's2=34', 'p1=1', 'p2=1']
for i in range(len(para_array)):
if para_array[i].find('s1=') > -1:
a = para_array[i]
soil1 = re.sub('s1=', '', a)
if para_array[i].find('s2=') > -1:
a = para_array[i]
soil2 = re.sub('s2=', '', a)
if para_array[i].find('p1=') > -1:
a = para_array[i]
checkbox1 = re.sub('p1=', '', a)
if para_array[i].find('p2=') > -1:
a = para_array[i]
checkbox2 = re.sub('p2=', '', a)
print(soil1, soil2, checkbox1, checkbox2)
Can use regex.
>>> import re
>>>
>>> para_array = ['s1=2.67', 's2=34', 'p1=1', 'p2=1']
>>> for item in para_array:
... print(re.search(r'=(\d.*)', item).group(1))
...
2.67
34
1
1
(Jul-18-2022, 02:43 PM)snippsat Wrote: [ -> ]Can use regex.
>>> import re
>>>
>>> para_array = ['s1=2.67', 's2=34', 'p1=1', 'p2=1']
>>> for item in para_array:
... print(re.search(r'=(\d.*)', item).group(1))
Slick, thank you. However, it crashes when the webform returns no data like this:
Output:
para_array = ['s1=2.67', 's2=', 'p1=', 'p2=1']
Also, how do I associate the output of the loop to a variable like:
soil1 = 2.67
soil2 = 34 etc.
(Jul-18-2022, 03:18 PM)ebolisa Wrote: [ -> ]Slick, thank you. However, it crashes when the webform returns no data like this:
That can be fixed,you should give it a try🔨
Quote:Also, how do I associate the output of the loop to a variable like:
It's a bad way🖐 to crate a bunch of variables this way,use a data structure as eg dictionary.
Example.
import re
def clean_up(lst : list) -> list:
fix_lst = []
try:
for item in para_array:
if item.endswith('='):
pass
else:
fix_lst.append(re.search(r'=(\d.*)', item).group(1))
return fix_lst
except AttributeError:
return 'Something went wrong'
if __name__ == '__main__':
para_array = ['s1=2.67', 's2=34', 'p1=1', 'p2=1']
#para_array = ['s1=2.67', 's2=', 'p1=', 'p2=1']
result = clean_up(para_array)
var = [f'soil{i}' for i in range(1, 5)]
record = dict(zip(var, result))
print(record)
Output:
{'soil1': '2.67', 'soil2': '34', 'soil3': '1', 'soil4': '1'}
Eg if use dictionary like this,it will not fail(give message) if search for value not in record.
>>> record.get('soil2', 'No in record')
'34'
>>> record.get('soil4', 'No in record')
'1'
>>> record.get('soil9', 'No in record')
'No in record
I don't think ebolisa wants to create new variables. I think the question is wondering how to make parsing "s1 = 2.67" result in assigning the value 2.67 to existing variable soil1. But your solution works for this problem too. There should not be a variable named soil1, there should be a dictionary of external parameters that can be set through the para_array. Instead of the program using soil1 it should use parameters["s1"]. An alternative (better alternative) is to use a class instead of a dictionary. The class would be responsible for parsing the para_array and it would know that "s1" is associated with the attribute soil1. If a class were used you would get the soil1 value using obj.soil1.