Python在字符串中定位特定数据

时间:2014-05-20 13:17:30

标签: python string python-3.x split coordinates

我从相机收到一个字符串,其中包含' detailinfo,X,Y,angle,而不是重要的'。 字符串如下所示: DET4 1 X:34.82 Y:70.28 VINKEL:244.33 LUTANDE:0 。 VINKEL =角。 现在我需要从中取出X,Y,角度数据,将其发送给机器人。 我完成它的方式如下,

CamX=received[9:15]
CamY=received[17:23]
Rotation=received[30:36]

问题在于"信息"在X,Y,角度,可以是3位数,或2位数。所以现在如果我得到一个3位数的X值,Y值将是假的。有没有其他方法来定位和读取X,Y,角度的值?

整个计划:

#RECEIVING DATA FROM CAMERA#
import socket
import time
host= "192.168.1.10"
port= 3000

print("start");
S = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
S.connect((host,port))
received = str(S.recv(1024), "utf-8")
print(received);
S.close()

#CONVERTING DATA TO X,Y COORDINATES#

CamX=received[9:15]      
CamY=received[17:23]     

CamX=float(CamX)/100
CamY=float(CamY)/100
CamPos= '('+str(CamX) +','+str(CamY)+',0.2,0.01,3.14,0.01)'

print('X:', CamX)
print('Y:', CamY)
print(CamPos)


#SENDING DATA TO ROBOT#
host2="192.168.1.5"
port2= 30000
print("start");
SR = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SR.bind((host2,port2))
SR.listen(5)
conn, addr=SR.accept()
print("Connected by ",addr)
conn.send(CamPos.encode('utf-8'))
print('Coordinates sent to robot')

4 个答案:

答案 0 :(得分:1)

以下内容不是非常强大。无论如何,试试:

received = 'DET4 1 X:34.82 Y:70.28 VINKEL:244.33 LUTANDE:0'
lst = received.split()
print(lst)
x = float(lst[2].split(':')[1])
y = float(lst[3].split(':')[1])
print('x:', x, 'y:', y)

第一个拆分使用默认参数 - 空格,制表符或换行符。

其他代码假定received具有相同的形式,因此信息的位置在列表中是相同的。冒号的第二个拆分分隔X或Y标识符。后面的[1]表示您需要第二部分 - 数字。 float()将其转换为实数。

答案 1 :(得分:1)

正如@rr所说,正则表达式可能更可靠。你应该开始here。这样的东西会起作用:

import re
input = 'DET4 1 X:34.82 Y:70.28 VINKEL:244.33 LUTANDE:0.'

try:
    cam_x = re.search(r'\sX:(?P<cam_x>\d+\.\d+)\s', input).group('cam_x')
    cam_y = re.search(r'\sY:(?P<cam_y>\d+\.\d+)\s', input).group('cam_y')
    rotation = re.search(r'\sVINKEL:(?P<rotation>\d+\.\d+)\s', input).group('rotation')
    print cam_x, cam_y, rotation
except AttributeError:
    print 'Unexpected formatting of the input.'

基本上这些正则表达式匹配:

  • \ d =数字
  • 以\分隔。 =点(如32.45)
  • 跟随“X:”(或“Y:”或“VINKEL:”)
  • 并被\ s = whitespaces包围。

答案 2 :(得分:0)

试试这个:

values = [(a[0],a[1]) for a in [ x.split(':') for x in text[7:].split()] if  a[0] == 'X' or [0] == 'Y' ]

print values

答案 3 :(得分:0)

感谢您的回答@SébastienDeprez,@ andmart,@ pepr

我对编码和python完全不熟悉,但我认为我已经设法自己解决了这个问题,也许不像你的代码那么花哨,但它应该做正确的工作吗?

r='DET4 1 X:134.812 Y:170.028 VINKEL:124.033 LUTANDE:0'
r=r.replace(r[0:9],'')
r=r.replace('Y:','')
r=r.replace('VINKEL:','')
r=r.replace('LUTANDE:0','')
r=r.replace(' ',',')
r=r.split(',')

camX=r[0]
camY=r[1]
camV=r[2]
print('R:',r)

print('X:',camX)
print('Y:',camY)
print('Vinkel:',camV)