import re
string = """
abc@1.0 name='abc'
abc@1.0 dep= {
"this",
"that",
}
abc@2.0 someInfo = "blahblah"
abc@2.0 name='abc'
abc@2.0 dep= {
"this",
"that",
}
abc@2.0 someInfo = "blahblah"
abc@2.0 name='abc'
abc@2.0 dep= {
"this",
"that",
}
abc@2.0 someInfo = "blahblah"
"""
def getResults(needle=None):
""" Analyze the outer structure """
# outer regex
rx = re.compile(re.escape(needle) + r''' # escape the needle to look for
\s*
(?P<key>\w+) # the key
\s*=\s*
(?:
(['"])(?P<value>.+?(?!\\))\2 # a single value
|
\{(?P<values>[^{}]+)\} # multiple values in {}
)''', re.VERBOSE)
def parseInnerValues(values=None):
""" Parse the inner values """
# inner regex
rxi = re.compile(r'''(["'])(.+?)(?<!\\)\1''')
return [m.group(2) for m in rxi.finditer(values)]
def getValues(match=None):
""" Decide """
if match.group('values'):
return parseInnerValues(match.group('values'))
else:
return match.group('value')
matches = {match.group('key') : getValues(match)
for match in rx.finditer(string)
}
return matches
print(getResults('abc@2.0'))
aW1wb3J0IHJlCgpzdHJpbmcgPSAiIiIKYWJjQDEuMCBuYW1lPSdhYmMnCmFiY0AxLjAgZGVwPSB7CiJ0aGlzIiwKInRoYXQiLAp9CmFiY0AyLjAgc29tZUluZm8gPSAiYmxhaGJsYWgiCmFiY0AyLjAgbmFtZT0nYWJjJwphYmNAMi4wIGRlcD0gewoidGhpcyIsCiJ0aGF0IiwKfQphYmNAMi4wIHNvbWVJbmZvID0gImJsYWhibGFoIgphYmNAMi4wIG5hbWU9J2FiYycKYWJjQDIuMCBkZXA9IHsKInRoaXMiLAoidGhhdCIsCn0KYWJjQDIuMCBzb21lSW5mbyA9ICJibGFoYmxhaCIKIiIiCgpkZWYgZ2V0UmVzdWx0cyhuZWVkbGU9Tm9uZSk6CgkiIiIgQW5hbHl6ZSB0aGUgb3V0ZXIgc3RydWN0dXJlICIiIgoJIyBvdXRlciByZWdleAoJcnggPSByZS5jb21waWxlKHJlLmVzY2FwZShuZWVkbGUpICsgcicnJwkjIGVzY2FwZSB0aGUgbmVlZGxlIHRvIGxvb2sgZm9yCgkJXHMqCgkJKD9QPGtleT5cdyspCQkJCQkJCSMgdGhlIGtleQoJCVxzKj1ccyoKCQkoPzoKCQkgICAgKFsnIl0pKD9QPHZhbHVlPi4rPyg/IVxcKSlcMgkJIyBhIHNpbmdsZSB2YWx1ZQoJCSAgICB8CgkJICAgIFx7KD9QPHZhbHVlcz5bXnt9XSspXH0JCQkJIyBtdWx0aXBsZSB2YWx1ZXMgaW4ge30KCQkpJycnLCByZS5WRVJCT1NFKQoKCWRlZiBwYXJzZUlubmVyVmFsdWVzKHZhbHVlcz1Ob25lKToKCQkiIiIgUGFyc2UgdGhlIGlubmVyIHZhbHVlcyAiIiIKCQkjIGlubmVyIHJlZ2V4CgkJcnhpID0gcmUuY29tcGlsZShyJycnKFsiJ10pKC4rPykoPzwhXFwpXDEnJycpCgkJcmV0dXJuIFttLmdyb3VwKDIpIGZvciBtIGluIHJ4aS5maW5kaXRlcih2YWx1ZXMpXQoKCWRlZiBnZXRWYWx1ZXMobWF0Y2g9Tm9uZSk6CgkJIiIiIERlY2lkZSAiIiIKCQlpZiBtYXRjaC5ncm91cCgndmFsdWVzJyk6CgkJCXJldHVybiBwYXJzZUlubmVyVmFsdWVzKG1hdGNoLmdyb3VwKCd2YWx1ZXMnKSkKCQllbHNlOgoJCQlyZXR1cm4gbWF0Y2guZ3JvdXAoJ3ZhbHVlJykKCgltYXRjaGVzID0ge21hdGNoLmdyb3VwKCdrZXknKSA6IGdldFZhbHVlcyhtYXRjaCkKCQkJCWZvciBtYXRjaCBpbiByeC5maW5kaXRlcihzdHJpbmcpCgkJCQl9CglyZXR1cm4gbWF0Y2hlcwoKcHJpbnQoZ2V0UmVzdWx0cygnYWJjQDIuMCcpKQ==