代码之家  ›  专栏  ›  技术社区  ›  Umair

在具有可变字段大小的python中解析字符串

  •  1
  • Umair  · 技术社区  · 6 年前

    我有一根66长的绳子。 RP000729SP001CT087ET02367EL048TP020DS042MF0220LT9.300000LN4.500000 . 两个字母(类似关键字 RP

    SP

    msgStr = "RP000729SP001CT087ET02367EL048TP020DS042MF0220LT9.300000LN4.500000"
    
    Ppm = msgStr[msgStr.find("RP")+2:msgStr.find("SP")]
    Speed = msgStr[msgStr.find("SP")+2:msgStr.find("CT")]
    Coolent_temp = msgStr[msgStr.find("CT")+2:msgStr.find("ET")]
    ETime = msgStr[msgStr.find("ET")+2:msgStr.find("EL")]
    E_load = msgStr[msgStr.find("EL")+2:msgStr.find("TP")]
    Throttle_pos = msgStr[msgStr.find("TP")+2:msgStr.find("DS")]
    Distance = msgStr[msgStr.find("DS")+2:msgStr.find("MF")]
    MAF = msgStr[msgStr.find("MF")+2:msgStr.find("LT")]
    Lat = msgStr[msgStr.find("LT")+2:msgStr.find("LN")]
    Lon = msgStr[msgStr.find("LN")+2:]
    
    print Ppm, Speed, Coolent_temp, ETime, E_load, Throttle_pos, Distance, MAF, Lat, Lon
    

    000729 001 087 02367 048 020 042 0220 9.300000 4.500000
    

    Example1_msgStr= "RP729SP14CT087ET2367EL48TP20DS42MF0220LT0.000000LN0.000000"
    

    729 14 087 2367 48 20 42 0220 0.000000 0.000000
    

    Example2_msgStr = "RP72956SP134CT874ET02367EL458TP20DS042MF0220LT53.000LN45.00" 
    

    72956 134 874 02367 458 20 042 0220 53.000 45.00 
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   T Burgis    6 年前

    应使用正则表达式查找两个字符串之间的可变长度匹配项:

    import re
    regex = r'RP(\d+)SP'
    strings = ['RP729SP14CT087ET2367EL48TP20DS42MF0220LT0.000000LN0.000000',
        'RP72956SP134CT874ET02367EL458TP20DS042MF0220LT53.000LN45.00']
    for string in strings:
        match = re.search(regex,string)
        print('Matched:',match.group(1))
    

    在regex中,方括号()指定要存储的组,并且\d+表示1个或多个数字字符。所以整个regex RP(\d+)SP 将在RP和SP之间找到一个长度可变的数字字符串。

    这向您展示了如何处理一个案例,您需要循环使用分隔符(RP、SP、CT等),以获取所需的所有信息。如果分隔符总是以相同的顺序出现,您可以构建一个巨大的regex来同时捕获所有组…

        2
  •  1
  •   ibarrond    6 年前

    如果要检查分隔符之间的字符,可以使用代码,然后将任何变量转换为 bool 类型。如果字符串不是空的,则意味着该字符串中存在某些内容,因此返回true。如果字符串为空,则返回false:

        msgStr = 'RP000729SP001CT087ET02367EL048TP020DS042MF0220LT9.300000LN4.500000'
    
        rpm = msgStr[msgStr.find("RP")+2:msgStr.find("SP")]       # Outputs '000729'
        Speed = msgStr[msgStr.find("SP")+2:msgStr.find("CT")]     # Outputs '001'
        coolent_temp = msgStr[msgStr.find("CT")+2:msgStr.find("ET")] # Outputs '087'
        ETime = msgStr[msgStr.find("ET")+2:msgStr.find("EL")]     # '02367'
        e_load = msgStr[msgStr.find("EL")+2:msgStr.find("TP")]    # '048'
        throttle_pos = msgStr[msgStr.find("TP")+2:msgStr.find("DS")] # '020'
        Distance = msgStr[msgStr.find("DS")+2:msgStr.find("MF")]  # Outputs '042'
        MAF = msgStr[msgStr.find("MF")+2:msgStr.find("LT")]       # Outputs '0220'
        Lat = msgStr[msgStr.find("LT")+2:msgStr.find("LN")]       # Outputs '9.300000'
        Lon = msgStr[msgStr.find("LN")+2:]                        # Outputs '4.500000'
    
        bool(rpm)           # Outputs True
        bool(Speed)         # Outputs True
        bool(coolent_temp)  # Outputs True
        bool(ETime)         # Outputs True
        bool(e_load)        # Outputs True
        bool(throttle_pos)  # Outputs True
        bool(Distance)      # Outputs True
        bool(MAF)           # Outputs True
        bool(Lat)           # Outputs True
        bool(Lon)           # Outputs True
    

    您可以同时检查多个字段是否为空:

        all_filled = bool(rpm) and bool(Speed) and bool(coolent_temp) and \
        bool(ETime) and bool(e_load) and bool(throttle_pos) and bool(Distance) \
        and bool(MAF) and bool(Lat) and bool(Lon)
    

    代码的设置方式,如果使用 msgStr1 你已经得到了你想要的分离:

    Example1_msgStr= "RP729SP14CT087ET2367EL48TP20DS42MF0220LT0.000000LN0.000000"
    # ... your code ...
    print (rpm, Speed, coolent_temp, ETime, e_load, throttle_pos, Distance, MAF, Lat, Lon)
    #> 729 14 087 2367 48 20 42 0220 0.000000 0.000000
    
    Example2_msgStr= "RP72956SP134CT874ET02367EL458TP20DS042MF0220LT53.000LN45.00"
    # ... your code ...
    print (rpm, Speed, coolent_temp, ETime, e_load, throttle_pos, Distance, MAF, Lat, Lon)
    #> 72956 134 874 02367 458 20 042 0220 53.000 45.00