在Python中通过正则表达式解析GPS接收器输出

14 投票
9 回答
17794 浏览
提问于 2025-04-11 20:45

我有一个朋友正在完成他的航空航天工程硕士学位。为了他的最终项目,他和一个小团队负责写一个程序,用来追踪天气气球、火箭和卫星。这个程序会接收来自GPS设备的数据,进行一些计算,然后用这些计算的结果来控制一系列电机,调整一个定向通信天线的位置,这样气球、火箭或卫星就能始终保持在视野中。

虽然我自己也是个编程新手,但比我朋友有更多的编程经验。所以当他向我请教时,我说服他用Python来写这个程序,因为这是我最喜欢的编程语言。

现在在这个项目中,我们正在处理从GPS设备接收到的数据解析代码。以下是一些示例输入,其中我们需要提取的数据用粗体标出:

$GPRMC,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,M,,,0000*1F
$GPRMC,093345.679,4234.7899,N,11344.2567,W,3,02,24.5,1000.23,M,,,0000*1F
$GPRMC,044584.936,1276.5539,N,88734.1543,E,2,04,33.5,600.323,M,,,*00
$GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06,02.2,25722.5,M,,,*00
$GPRMC,066487.954,4572.0089,S,45572.3345,W,3,09,15.0,35000.00,M,,,*1F

这里是对这些数据的进一步解释:

“看起来我需要从每一行提取五个东西。要记住,这些区域中的任何一个可能是空的。也就是说,可能会有两个逗号紧挨着,比如',,,'。某些字段可能随时都有内容。有些字段只有两到三个可能的选项,但我觉得我不应该依赖这一点。”

两天前,我的朋友获得了用于追踪最近一次天气气球发射的GPS接收器的完整日志。数据相当长,所以我把它全部放在这个pastebin上。

我自己对正则表达式也还很陌生,所以我在寻求一些帮助。

9 个回答

8

用split比用正则表达式简单多了。

>>> line="$GPRMC,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,M,,,0000*1F "
>>> line.split(',')
['$GPRMC', '092204.999', '4250.5589', 'S', '14718.5084', 'E', '1', '12', '24.4', '89.6', 'M', '', '', '0000*1F ']
>>> 
10

你可以使用一个叫做 pynmea2 的库来解析NMEA日志。

>>> import pynmea2
>>> msg = pynmea2.parse('$GPGGA,142927.829,2831.4705,N,08041.0067,W,1,07,1.0,7.9,M,-31.2,M,0.0,0000*4F')
>>> msg.timestamp, msg.latitude, msg.longitude, msg.altitude
(datetime.time(14, 29, 27), 28.524508333333333, -80.683445, 7.9)

免责声明:我是pynmea2的作者

16

使用分割功能就能解决这个问题。这里有一个不错的方法来提取数据:

>>> line = "$GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06,02.2,25722.5,M,,,*00"
>>> line = line.split(",")
>>> neededData = (float(line[2]), line[3], float(line[4]), line[5], float(line[9]))
>>> print neededData
(3248.7779999999998, 'N', 11355.7832, 'W', 25722.5)

撰写回答