我要解决的问题:
s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c"""
s1 = """X3 InRXBytes=1257890123 X2 OutRXBytes=871625343 X5 OutRXBytes=71625343"""
让我们以上述两个字符串为例,我想把每个字符串分成不同的部分:
对于字符串s,
part1 = '''X8 ifInDiscards=14308c'''
part2 = '''X8 ifOutDiscards=133796c'''
针对字符串 s1,
part1 = '''X3 InRXBytes= 1257890123'''
part2 = '''X2 OutRXBytes= 871625343'''
part3 = '''X5 OutRXBytes= 71625343'''
因此,正如上面两个字符串示例所示,需要拆分的字符串格式为:
'''metric1=value1 metric2=value2....metricN=valueN'''
在上面的示例中,指标名称可以包含空格。
到目前为止,这是我尝试过但没有成功的内容:
>>> s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c"""
>>>
>>>
>>>
>>> s.split('=')
['X8 ifInDiscards', '14308c X8 ifOutDiscards', '133796c']
>>>
问题是如何以最有效的方式拆分字符串?这里是我尝试过但没有成功的另一种方法:
>>> s 'X8 ifInDiscards=14308c X8 ifOutDiscards=133796c'
>>> pattern = r'''[0-9a-zA-Z]?=[0-9a-zA-Z]? [0-9a-zA-Z]?=[0-9a-zA-Z]?'''
>>> re.search(pattern, s)
度量名称的长度可以是可变的,并且其中可以有多个空格...
最后编辑:这是最终的方法,似乎只适用于字符串“s”,而不适用于字符串“s1”,我想知道是否有更好的方法来解决这个问题:
>>> pattern = r'''([0-9a-zA-Z ].*?=[0-9a-zA-Z ].*?) ([0-9a-zA-Z ].*?=[0-9a-zA-Z ].*)'''
>>> s
'X8 ifInDiscards=14308c X8 ifOutDiscards=133796c'
>>> re.search(pattern, s).groups()
('X8 ifInDiscards=14308c', 'X8 ifOutDiscards=133796c')
s1
。你可以将第一半分组并添加一个+
而不是再次复制和粘贴它,或者你可以只使用第一半并使用re.findall
而不是re.search
。 - abarnert.*
会导致第一组匹配第一个metric=value对和所有后续字符作为一个大匹配。如果您遵循其他建议,匹配除=
以外的所有内容,并类似地匹配=
另一侧的所有非空格内容,那么这将变得更加容易。 - abarnertre.search
查找一个大组(无论如何)只会得到一个大字符串。您需要通过使用组将要作为单独值的部分分组。(而且您可能希望在=
之前和之后分别使用单独的组;否则,在提取每个组后,您只需对每个组进行.split('=')
操作。) - abarnert