使用可变字段大小解析Python中的字符串

使用可变字段大小解析Python中的字符串,python,Python,我有这根66长的绳子。 RP000729SP001CT087ET02367EL048TP020DS042MF0220LT9.300000LN4.500000。两个字母(关键字如RP)显示下一个关键字之前的下一个is值 现在我正在解析字符串,使两个关键字之间的字节数保持不变,即RP和SP之间的000729。下面是这样解析的代码 msgStr = "RP000729SP001CT087ET02367EL048TP020DS042MF0220LT9.300000LN4.500000" Ppm = m

我有这根66长的绳子。
RP000729SP001CT087ET02367EL048TP020DS042MF0220LT9.300000LN4.500000
。两个字母(关键字如
RP
)显示下一个关键字之前的下一个is值

现在我正在解析字符串,使两个关键字之间的字节数保持不变,即
RP
SP
之间的000729。下面是这样解析的代码

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
现在我想收集两个关键字之间是否有任意数量的字节。下面举例说明

示例1:

Example1_msgStr= "RP729SP14CT087ET2367EL48TP20DS42MF0220LT0.000000LN0.000000"
预期输出1:

729 14 087 2367 48 20 42 0220 0.000000 0.000000
示例2:

Example2_msgStr = "RP72956SP134CT874ET02367EL458TP20DS042MF0220LT53.000LN45.00" 
预期输出2:

72956 134 874 02367 458 20 042 0220 53.000 45.00 

如果要检查分隔符之间的字符,可以使用代码,然后将任何变量转换为
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

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

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))
在正则表达式中,括号()指定要存储的组,\d+表示1个或多个数字字符。因此,整个regex
RP(\d+)SP
将在RP和SP之间找到一个长度可变的数字字符串

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