在Python中识别某些字符串的最佳方法

在Python中识别某些字符串的最佳方法,python,regex,string,Python,Regex,String,我正在写一个系统来读取来自跟踪卡车的设备的数据 该系统将接收不同类型设备的信息,因此将接收的跟踪字符串将不同,从而导出设备模型 因此,我需要知道如何识别这些字符串,以便对其进行正确的处理。例如,其中一个单元发送以下字符串: [0,0,13825,355255057406002,0,250814,142421,-2197354498319328,-4743040708824992,800,9200,0,0,0,0,0,12,0,31,0,107] 另一个设备,字符串如下所示: SA200STT;

我正在写一个系统来读取来自跟踪卡车的设备的数据

该系统将接收不同类型设备的信息,因此将接收的跟踪字符串将不同,从而导出设备模型

因此,我需要知道如何识别这些字符串,以便对其进行正确的处理。例如,其中一个单元发送以下字符串:

[0,0,13825,355255057406002,0,250814,142421,-2197354498319328,-4743040708824992,800,9200,0,0,0,0,0,12,0,31,0,107]
另一个设备,字符串如下所示:

SA200STT;459055;209;20140806;23:18:28;20702;-22.899244;-047.047640;000.044;000.00;11;1;68548721;12.60;100000;2;0016
所以我的问题是,我识别这些字符串的最佳方法是什么?

听起来很简单。 只需检查数据的一些区别特征即可识别格式。 根据每种格式的复杂程度,您可能不需要使用正则表达式就可以做到这一点

def parse(data):
    parse_format = get_parser(data)
    return parse_format(data)

def get_parser(data):
    if is_format_a(data):
        return parse_format_a;
    if is_format_b(data):
        return parse_format_b;
    #etc

def is_format_a(data):
    return data[0] == '['

def parse_format_a(data):
    return data.strip('[]').split(',')

def parse_format_b(data):
    return data.split(';')
听起来很简单。 只需检查数据的一些区别特征即可识别格式。 根据每种格式的复杂程度,您可能不需要使用正则表达式就可以做到这一点

def parse(data):
    parse_format = get_parser(data)
    return parse_format(data)

def get_parser(data):
    if is_format_a(data):
        return parse_format_a;
    if is_format_b(data):
        return parse_format_b;
    #etc

def is_format_a(data):
    return data[0] == '['

def parse_format_a(data):
    return data.strip('[]').split(',')

def parse_format_b(data):
    return data.split(';')

第一步是确定每种格式的独特之处。在您给出的示例中,第一个字符串以[]开头和结尾,第二个版本以序列SA200STT开头。因此,第一个近似值是匹配:

import re
def identify(s):
    if re.match(r'^\[.*\]$', s):
        return "type 1"
    elif re.match(r'^SA200STT.*$', s):
        return "type 2"
    else:
        return "unknown"

s1 = r'[0,0,13825,355255057406002,0,250814,142421,-2197354498319328,-4743040708824992,800,9200,0,0,0,0,0,12,0,31,0,107]'
s2 = r'SA200STT;459055;209;20140806;23:18:28;20702;-22.899244;-047.047640;000.044;000.00;11;1;68548721;12.60;100000;2;0016'

print "s1:", identify(s1)
print "s2:", identify(s2)
当我运行上述程序时,我得到:

s1: type 1
s2: type 2
我怀疑这是你需要的实际算法,但这只是一般的想法。找出如何区分每种格式,然后生成一个表达式来检测它

关于使用正则表达式的注意事项:


正则表达式可能很慢,通常应该避免使用,因为它们不仅是因为速度问题,而且会使代码难以理解。如果性能或可读性是一个问题,考虑替代的解决方案,如比较第一个n个字符,或最后的n个字符。

第一步是确定什么是唯一的每种格式。在您给出的示例中,第一个字符串以[]开头和结尾,第二个版本以序列SA200STT开头。因此,第一个近似值是匹配:

import re
def identify(s):
    if re.match(r'^\[.*\]$', s):
        return "type 1"
    elif re.match(r'^SA200STT.*$', s):
        return "type 2"
    else:
        return "unknown"

s1 = r'[0,0,13825,355255057406002,0,250814,142421,-2197354498319328,-4743040708824992,800,9200,0,0,0,0,0,12,0,31,0,107]'
s2 = r'SA200STT;459055;209;20140806;23:18:28;20702;-22.899244;-047.047640;000.044;000.00;11;1;68548721;12.60;100000;2;0016'

print "s1:", identify(s1)
print "s2:", identify(s2)
当我运行上述程序时,我得到:

s1: type 1
s2: type 2
我怀疑这是你需要的实际算法,但这只是一般的想法。找出如何区分每种格式,然后生成一个表达式来检测它

关于使用正则表达式的注意事项:


正则表达式可能很慢,通常应该避免使用,因为它们不仅是因为速度问题,而且会使代码难以理解。如果性能或可读性是一个问题,考虑替代的解决方案,如比较第一个N个字符,或最后的N个字符。

< P>布莱恩奥克利给出了一个很好的解决方案。但用他自己的话来说:第一步是确定每种格式的独特之处

您只需检查其中一个字符;或者,是存在的。即使存在或不存在,因为它们是排他性的

例如:

s1  = "[0,0,13825,355255057406002,0,250814,142421,-2197354498319328,-4743040708824992,800,9200,0,0,0,0,0,12,0,31,0,107]"
s2 = r'SA200STT;459055;209;20140806;23:18:28;20702;-22.899244;-047.047640;000.044;000.00;11;1;68548721;12.60;100000;2;0016'

if ',' in s1:
    print("Type 1")
else
    print("Type 2")

这似乎是最快的方法。由于使用正则表达式的速度很慢,通过阅读您的问题,我可以说您将从设备上阅读。因此,您需要速度。

Bryan Oakley给出了一个很好的解决方案。但用他自己的话来说:第一步是确定每种格式的独特之处

您只需检查其中一个字符;或者,是存在的。即使存在或不存在,因为它们是排他性的

例如:

s1  = "[0,0,13825,355255057406002,0,250814,142421,-2197354498319328,-4743040708824992,800,9200,0,0,0,0,0,12,0,31,0,107]"
s2 = r'SA200STT;459055;209;20140806;23:18:28;20702;-22.899244;-047.047640;000.044;000.00;11;1;68548721;12.60;100000;2;0016'

if ',' in s1:
    print("Type 1")
else
    print("Type 2")

这似乎是最快的方法。由于使用正则表达式的速度很慢,通过阅读您的问题,我可以说您将从设备上阅读。因此,您需要速度。

检查字符串中的第一个字符可能是一个好的开始?您所说的识别是什么意思?你想解析它还是仅仅区分这两个版本?是的,但是,在其他设备中,第一个字符可能等于另一个设备。首先,我想区分这两个版本,因此,我已经知道每个版本是什么,我可以给出不同的处理如果两个以上的设备发送具有相同前缀或头的消息,您必须找到该消息的其他显著特征。或者只是看看消息的实际来源。一个好的开始可能是检查字符串中的第一个字符?你说的标识是什么意思?你想解析它还是仅仅区分这两个版本?是的,但是,在其他设备中,第一个字符可能等于另一个设备。首先,我想区分这两个版本,因此,我已经知道每个版本是什么,我可以给出不同的处理如果两个以上的设备发送具有相同前缀或头的消息,您必须找到该消息的其他显著特征。或者您刚刚看到消息的实际来源。+1但是如果您有大量数据,您可能希望避免使用正则表达式。@dss539:这一点很好。我添加了一条说明,如果性能或可读性是一个问题,请避免使用正则表达式。谢谢@BryanOakley,这就是我需要的,类似这样的东西。只是对代码有点怀疑
,字符串前面的“r”是什么?@VitorLuis:r表示它是原始字符串文本。请参见+1,但如果您有大量数据,您可能希望避免使用正则表达式。@dss539:这一点很好。我添加了一条说明,如果性能或可读性是一个问题,请避免使用正则表达式。谢谢@BryanOakley,这就是我需要的,类似这样的东西。只是对代码有疑问,字符串前面的“r”是什么?@VitorLuis:r表示它是原始字符串文字。看见