I need to format a string dictionary before convert it into dict I tried it with regex:
decmark_reg = re.compile('(?<=\d),(?=\d)')
dict_decmark = decmark_reg.sub('.',dict_quotes)
convertedDict = json.loads(dict_decmark)
but then I realized it mess with "fingerOne_OffTimes" values
dict_str = '{"level":0,6,
"params":{
"startLvlTime":1114.3851318359375,
"fingerOne_OffTimes":[459,4716491699219,78532]}}
desired result
dict_str = '{"level":0.6, # 0,6 -> 0.6
"params":{
"startLvlTime":1114.3851318359375,
"fingerOne_OffTimes":[459,4716491699219,78532]}} # no change
Would need a pattern that detect all comas but ones which have quot mark right behind
CodePudding user response:
Try (regex101):
import re
dict_str = """\
{"level":0,6,
"params": {
"startLvlTime":1114.3851318359375,
"fingerOne_OffTimes":[459,4716491699219,78532]}}"""
pat = re.compile(r"(\[.*?\])|(\d,\d)")
dict_str = pat.sub(
lambda g: g.group(1) or g.group(2).replace(",", "."), dict_str
)
print(dict_str)
Prints:
{"level":0.6,
"params": {
"startLvlTime":1114.3851318359375,
"fingerOne_OffTimes":[459,4716491699219,78532]}}
CodePudding user response:
You can match strings that consist of digits and at least two commas, and then match your pattern in all other contexts:
decmark_reg = re.compile(r'(\d (?:,\d ){2,})|(?<=\d),(?=\d)')
dict_decmark = decmark_reg.sub(lambda x: x.group(1) or '.', dict_quotes)
Details:
(\d (?:,\d ){2,})
- Group 1: one or more digits and then two or more sequences of a comma and one or more digits|
- or(?<=\d),(?=\d)
- a comma that is enclosed with digits on both ends
If Group 1 matches, its value is returned, else, the .
is returned.