Python正则表达式解析含多段版本号的键值对字符串时的取值问题求助
Python正则表达式解析含多段版本号的键值对字符串时的取值问题求助
我最近在用Python正则处理一个键值对格式的字符串时遇到了麻烦,想请教大家怎么解决😅
我的目标字符串是这样的:
payload = "status=0/eStopStatus=2/version=1.0.16/runTime=005320"
我原本写了两段正则来分别提取变量名和对应的值:
import re payload = "status=0/eStopStatus=2/version=1.0.16/runTime=005320" variables = re.findall(r'([\w]+)=', payload) values = re.findall(r"[-+]?(?:\d*\.*\d+)", payload)
变量名的提取是正常的,得到的结果是:
['status', 'eStopStatus', 'version', 'runTime']
但问题出在值的提取上——因为version的值是1.0.16,里面有两个小数点,导致我的正则把它拆成了两部分,最终得到的值列表是:
['0', '2', '1.0', '.16', '005320']
我对正则的语法细节一直有点懵,实在搞不定这个问题,有没有大佬能帮忙指点一下?
解决方案推荐
其实不用分开提取变量和值,我们可以一步到位匹配完整的键值对,这样更简单也不容易出错:
方法1:直接匹配键值对
用这个正则可以一次性把每个键和对应的值都抓出来:
kv_pairs = re.findall(r'(\w+)=([^/]+)', payload)
运行后得到的结果是:
[('status', '0'), ('eStopStatus', '2'), ('version', '1.0.16'), ('runTime', '005320')]
如果需要把它们转成字典也很方便:
result_dict = dict(kv_pairs) # 结果:{'status': '0', 'eStopStatus': '2', 'version': '1.0.16', 'runTime': '005320'}
正则解释:
(\w+):匹配变量名,也就是字母、数字和下划线组成的字符串=:匹配键和值之间的等号([^/]+):匹配除了/之外的所有字符(因为/是键值对的分隔符),这样不管值里有几个小数点或者其他合法字符,都能完整匹配到
方法2:调整取值的正则(如果一定要分开提取)
如果你还是想保持分开提取变量和值的逻辑,可以把取值的正则改成下面这样:
values = re.findall(r"[-+]?(?:\d+(?:\.\d+)*)", payload)
运行后得到的值列表就是正确的:
['0', '2', '1.0.16', '005320']
正则解释:
[-+]?:可选的正负号\d+:至少一个数字(保证不会以小数点开头)(?:\.\d+)*:可以重复任意多次「小数点+数字」的组合,这样就能匹配像1.0.16这种多段的版本号格式
这样两种方法都能解决你遇到的问题,推荐第一种,逻辑更清晰也更通用~
备注:内容来源于stack exchange,提问作者ADL
相关产品推荐
相关产品推荐

