从UDP流中接收的数据对象中提取整数

时间:2017-09-20 09:14:36

标签: python udp extract

我正在从数据库发送的 UDP 流中接收数据,该数据库将其传入的数据转发到Python脚本。

我正在使用以下代码来接收数据:

import socket

UDP_IP = "localhost"
UDP_PORT = 5060
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

while True:
   data, addr = sock.recvfrom(1024)
   print (data)

数据作为字节对象返回(如果我错了,请纠正我)。打印数据变量看起来像这样:

b'nulldata,country=swe,region=europe,tag=tagged value=10 1505893007463590886'

但也可能看起来像这取决于从服务器发送的数据:

b'nulldata,country=swe,region=europe,tag=tagged value=4123.4331,value2=123.5123, 1505893008892590551'

value=value2=以及 id (1505893008892590551)之后提取数值并将其存储在字典或列表中的最有效方法是什么?看起来像这样?

[1505893008892590551, 4123.4331, 123.5123]

{'ID': 1505893008892590551, 'Value': 4123.4331, 'Value2': 123.5123}

一种通用的方法,即使我添加了更多的值也会有效!

1 个答案:

答案 0 :(得分:0)

  

数据作为“类字节对象”返回

是的。但是,在Python 2中,这与普通字符串相同。要在Python 3中获取字符串,请执行b'my text'.decode()

然后

s1 = 'nulldata,country=swe,region=europe,tag=tagged value=10 1505893007463590886'
s2 = 'nulldata,country=swe,region=europe,tag=tagged value=4123.4331,value2=123.5123, 1505893008892590551'

(两个字符串)

使用正则表达式

与您的两个输入相匹配的正则表达式可能类似于

pattern = re.compile(r'''
    value=(?P<Value>[0-9.]+)            # capture `value`
    (?:,value2=(?P<Value2>[0-9.]+))?    # optionally capture `value2`
    ,?\                                 # optional comma and a space
    (?P<ID>\d+)$                        # capture `id` at the end 
    ''', re.VERBOSE)

想要注意:

  • 详细的正则表达式 - 忽略空格和注释
  • 命名捕获组(?P<name>pattern)
  • 非捕获组(?:pattern),也是可选的(之后是问号)
然后可以使用groupdict

访问

字典

>>> re.search(pattern, s1).groupdict()
{'ID': '1505893007463590886', 'Value2': None, 'Value': '10'}
>>> re.search(pattern, s2).groupdict()
{'ID': '1505893008892590551', 'Value2': '123.5123', 'Value': '4123.4331'}