需要在正则表达式中为Python提供建议

2024-09-30 02:29:01 发布

您现在位置:Python中文网/ 问答频道 /正文

通过服务器的API请求接收的数据。要分析的数据:

b'{"Id":"9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0","Name":"\xd0\x9a\xd0\xb0\xd0\xbd\xd0\xb0\xd0\xbb 89","AltEnabled":true,"ReceiveVideoMbps":2.6148132324218749,"ReceiveAltVideoMbps":0.18560943603515626,"WriteVideoMbps":2.5809969113862512,"Status":"Ok"}'
b'{"Id":"ef666ea5-fe40-4c9c-8953-1b2c5ddda4ad","Name":"\xd0\x9a\xd0\xb0\xd0\xbd\xd0\xb0\xd0\xbb 68","AltEnabled":true,"ReceiveVideoMbps":0.33305744615277988,"ReceiveAltVideoMbps":0.0349517822265625,"WriteVideoMbps":0.33188474615605063,"Status":"Ok"}'

这个正则表达式给我“Id”和“Name”:

regex = b"{\"Id\":\"(?P<id>.*?)\",\"Name\":\"(?P<name>.*?)\""

但我无法解析“ReceiveVideoMbps”参数

我应该如何更新regex以开始解析“ReceiveVideoMbps”参数


Tags: 数据nameidtruestatusokxbdxb0
2条回答

我会将正则表达式用作:

regex = r"{\"Id\":\"(?P<id>.*?)\",\"Name\":\"(?P<name>.*?)\",.*,\"ReceiveAltVideoMbps\":(?P<rec>.*?),.*"

这将导致如下结果:

Group `id`  9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0
Group `name`    \xd0\x9a\xd0\xb0\xd0\xbd\xd0\xb0\xd0\xbb 89
Group `rec` 0.18560943603515626

可以使用JSON而不是re有效地解析这种类型的字符串

我向你展示了两种方式。但是,在执行任何解析之前,需要使用decode()方法将bytes对象转换为string等价物

正则表达式方式

代码

import re
x = b'{"Id":"9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0","Name":"\xd0\x9a\xd0\xb0\xd0\xbd\xd0\xb0\xd0\xbb 89","AltEnabled":true,"ReceiveVideoMbps":2.6148132324218749,"ReceiveAltVideoMbps":0.18560943603515626,"WriteVideoMbps":2.5809969113862512,"Status":"Ok"}'
regex = re.compile(r"{\"Id\":\"(?P<id>.*?)\",\"Name\":\"(?P<name>.*?)\",.*,\"ReceiveVideoMbps\":(?P<rec>.*?),.*")
items = regex.findall(x.decode())
print(items)

输出

输出将是一个元组列表

[('9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0', 'Канал 89', '2.6148132324218749')]

JSON方式

代码

import json
x = b'{"Id":"9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0","Name":"\xd0\x9a\xd0\xb0\xd0\xbd\xd0\xb0\xd0\xbb 89","AltEnabled":true,"ReceiveVideoMbps":2.6148132324218749,"ReceiveAltVideoMbps":0.18560943603515626,"WriteVideoMbps":2.5809969113862512,"Status":"Ok"}'
items = json.loads(x.decode())

print(items)

输出

输出为字典

{'AltEnabled': True,
 'Id': '9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0',
 'Name': 'Канал 89',
 'ReceiveAltVideoMbps': 0.18560943603515626,
 'ReceiveVideoMbps': 2.614813232421875,
 'Status': 'Ok',
 'WriteVideoMbps': 2.580996911386251}

现在,您可以使用dict键访问元素

示例

print(items['Id'])  # 9e46ba44-2b89-4f9d-88eb-5b5dcfe908e0
print(items['Name']) # Канал 89
print(items['ReceiveVideoMbps']) # 2.614813232421875

相关问题 更多 >

    热门问题