Parsing key values ​​in a string

I have a string that I am getting from a command line application. It has the following structure:

-- section1 --
item11|value11
item12|value12
item13

-- section2 --
item21|value21
item22

      

what I would like is to parse this into a dict so that I can easily access the values ​​with:

d['section1']['item11']

      

I've already solved this for the case where there are no partitions and each key has a value, but otherwise I get errors. I've tried a couple of things, but it gets complicated because nothing works either. This is what I have now:

s="""
item11|value11
item12|value12
item21|value21
"""
d = {}
for l in s.split('\n'):
    print(l, l.split('|'))
    if l != '':
        d[l.split('|')[0]] = l.split('|')[1]

      

Can someone help me expand this for the case of a section and when there are no values?

+3


source to share


2 answers


Seems like a perfect fit for the ConfigParser module in the standard library:

d = ConfigParser(delimiters='|', allow_no_value=True)
d.SECTCRE = re.compile(r"-- *(?P<header>[^]]+?) *--")  # sections regex
d.read_string(s)

      



You now have an object that you can access like a dictionary:

>>> d['section1']['item11']
'value11'
>>> d['section2']['item22']   # no value case
None

      

+5


source


Regexes is a good result:



import re


def parse(data):
    lines = data.split("\n") #split input into lines
    result = {}
    current_header = ""

    for line in lines:
        if line: #if the line isn't empty
            #tries to match anything between double dashes:
            match = re.match(r"^-- (.*) --$", line)
            if match: #true when the above pattern matches
                #grabs the part inside parentheses:
                current_header = match.group(1)
            else:
                #key = 1st element, value = 2nd element:
                key, value = line.split("|")
                #tries to get the section, defaults to empty section:
                section = result.get(current_header, {})
                section[key] = value #adds data to section
                result[current_header] = section #updates section into result
    return result #done.

print parse("""
-- section1 --
item1|value1
item2|value2
-- section2 --
item1|valueA
item2|valueB""")

      

+1


source







All Articles