修复具有最接近等效项的特殊字符(无映射)

2024-10-01 13:36:07 发布

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

我从Python中的传感器(GPS)获取输出,由于某些原因,输出不是完全干净的。我已经在使用pynmea2及其校验和来过滤坏行,但我想提高接受率

如果查看传感器中的一些样本数据,您会发现许多字符被替换为可以由人更正的字符,例如®=。或³=3。另一方面,有些不太清楚,例如¨或±或Ç=G而不是C

我试图研究如何解决这个问题,但除了创建硬编码地图或搜索和替换,我什么都想不出来。是否有一个图书馆或方法来“清理”我的输入,以解决至少一个明显的问题,从而提高我的接受率

nmea = [
    "$GNRMC,175230.00,A,5231.08575,N,01324.94302,E,0.099,,300321,,,A,V*17",
    "$GNRMC,175211.00,A,5231.08495,N,01324.94370,E,2.771,348.30,300321,,,A,V*0F",
    "$GNGGA,175140.00,5231.06514,N,01325.03302,E,1,11,1.22,33.9,M,42.1,Í,,*7F",
    "$GNRMC,175141.00,A,5231.06307,N,01³25.02563,E,16.734,234.24,300³21,,,A,V*3A",
    "$GNGÇA,175141.00,5231.06307,N,01325.02563,E,1,11,1®22,33.6,M,42.1,M,,*75",
    "$GNRMC,175142.00,A,5231.°6059,N,01325.01869,E,17.220,235.29,300321,,,A,V*38",
    "$GNGGA,175142.00,5231.06059,N,01325.01869,E,1,11,±.22,33.5,M,42.1,M,,*79",
    "$GNRMC,175143.00,A,5231.05861,N,01325.01218,E,16.¶45,238.31,300321,,,A,V*37",
    "$GNGGA,175143.00,5231.05861,N,013²5.01218,E,1,11,1.22,34.7,M,42.1,M,,*71",
    "$GNRMC,175144.00,A,5231.05689,N,01325.00574,E,16.090,241.36,300321,,,A,V*33",
    "$GNGGA,175144.00,5231.05689,N,01325.00574,E,1,11,1.28,36.0,M,42.1,M,,*7D",
    "$GNRMC,175145.00,A,5231.05478,N,01324.99957,E,16.045,240.96,300321,,,A,V*31",
    "$GNGGA,175145.00,5231.05478,N,01324.99957,E,1,11,1.22,36.8,M,42.1,M,,*7E",
    "$GNRMC,175146®00,A,5231.05277,N,01324.99327,E,15.832,241.30,300321,,,A,V*30",
    "$GNGGA,175146.00,5231.05277,N,01324.99327,E,1,11,1.22,37.3,M,42.1,M,,*73",
    "$GNGGA,175230.00,5231.08575,N,01324.94302,E,1,12,0.96,56.7,M,42.1,M,,*7D"]

Tags: 数据方法编码图书馆地图原因传感器字符
1条回答
网友
1楼 · 发布于 2024-10-01 13:36:07

®/.³/3Í/M(相同位)之间存在一位错误:

>>> for c in s:
...     print(f'{c} {ord(c):08b}')
... 
® 10101110
. 00101110
³ 10110011
3 00110011
Í 11001101
M 01001101

您的硬件可能有问题。由于数据是ASCII码,高位(第7位)应始终为0,因此如果无法解决硬件问题,您可以只过滤输出:

import re
from pprint import pprint

nmea = [
    "$GNRMC,175230.00,A,5231.08575,N,01324.94302,E,0.099,,300321,,,A,V*17",
    "$GNRMC,175211.00,A,5231.08495,N,01324.94370,E,2.771,348.30,300321,,,A,V*0F",
    "$GNGGA,175140.00,5231.06514,N,01325.03302,E,1,11,1.22,33.9,M,42.1,Í,,*7F",
    "$GNRMC,175141.00,A,5231.06307,N,01³25.02563,E,16.734,234.24,300³21,,,A,V*3A",
    "$GNGÇA,175141.00,5231.06307,N,01325.02563,E,1,11,1®22,33.6,M,42.1,M,,*75",
    "$GNRMC,175142.00,A,5231.°6059,N,01325.01869,E,17.220,235.29,300321,,,A,V*38",
    "$GNGGA,175142.00,5231.06059,N,01325.01869,E,1,11,±.22,33.5,M,42.1,M,,*79",
    "$GNRMC,175143.00,A,5231.05861,N,01325.01218,E,16.¶45,238.31,300321,,,A,V*37",
    "$GNGGA,175143.00,5231.05861,N,013²5.01218,E,1,11,1.22,34.7,M,42.1,M,,*71",
    "$GNRMC,175144.00,A,5231.05689,N,01325.00574,E,16.090,241.36,300321,,,A,V*33",
    "$GNGGA,175144.00,5231.05689,N,01325.00574,E,1,11,1.28,36.0,M,42.1,M,,*7D",
    "$GNRMC,175145.00,A,5231.05478,N,01324.99957,E,16.045,240.96,300321,,,A,V*31",
    "$GNGGA,175145.00,5231.05478,N,01324.99957,E,1,11,1.22,36.8,M,42.1,M,,*7E",
    "$GNRMC,175146®00,A,5231.05277,N,01324.99327,E,15.832,241.30,300321,,,A,V*30",
    "$GNGGA,175146.00,5231.05277,N,01324.99327,E,1,11,1.22,37.3,M,42.1,M,,*73",
    "$GNGGA,175230.00,5231.08575,N,01324.94302,E,1,12,0.96,56.7,M,42.1,M,,*7D"]

def fix(m):
    a = m.group(0)
    b = chr(ord(m.group(0)) & 0x7F) # clear bit 7.
    print(f'Replaced {a} with {b}')
    return b

for i,v in enumerate(nmea):
    nmea[i] = re.sub(r'[\x80-\xff]',fix,v)

pprint(nmea)

输出:

Replaced Í with M
Replaced ³ with 3
Replaced ³ with 3
Replaced Ç with G
Replaced ® with .
Replaced ° with 0
Replaced ± with 1
Replaced ¶ with 6
Replaced ² with 2
Replaced ® with .
['$GNRMC,175230.00,A,5231.08575,N,01324.94302,E,0.099,,300321,,,A,V*17',
 '$GNRMC,175211.00,A,5231.08495,N,01324.94370,E,2.771,348.30,300321,,,A,V*0F',
 '$GNGGA,175140.00,5231.06514,N,01325.03302,E,1,11,1.22,33.9,M,42.1,M,,*7F',
 '$GNRMC,175141.00,A,5231.06307,N,01325.02563,E,16.734,234.24,300321,,,A,V*3A',
 '$GNGGA,175141.00,5231.06307,N,01325.02563,E,1,11,1.22,33.6,M,42.1,M,,*75',
 '$GNRMC,175142.00,A,5231.06059,N,01325.01869,E,17.220,235.29,300321,,,A,V*38',
 '$GNGGA,175142.00,5231.06059,N,01325.01869,E,1,11,1.22,33.5,M,42.1,M,,*79',
 '$GNRMC,175143.00,A,5231.05861,N,01325.01218,E,16.645,238.31,300321,,,A,V*37',
 '$GNGGA,175143.00,5231.05861,N,01325.01218,E,1,11,1.22,34.7,M,42.1,M,,*71',
 '$GNRMC,175144.00,A,5231.05689,N,01325.00574,E,16.090,241.36,300321,,,A,V*33',
 '$GNGGA,175144.00,5231.05689,N,01325.00574,E,1,11,1.28,36.0,M,42.1,M,,*7D',
 '$GNRMC,175145.00,A,5231.05478,N,01324.99957,E,16.045,240.96,300321,,,A,V*31',
 '$GNGGA,175145.00,5231.05478,N,01324.99957,E,1,11,1.22,36.8,M,42.1,M,,*7E',
 '$GNRMC,175146.00,A,5231.05277,N,01324.99327,E,15.832,241.30,300321,,,A,V*30',
 '$GNGGA,175146.00,5231.05277,N,01324.99327,E,1,11,1.22,37.3,M,42.1,M,,*73',
 '$GNGGA,175230.00,5231.08575,N,01324.94302,E,1,12,0.96,56.7,M,42.1,M,,*7D']

相关问题 更多 >