具有多个空格的复杂字符串

时间:2013-11-23 01:41:14

标签: python string split

我想解决的问题:

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')

2 个答案:

答案 0 :(得分:1)

如果查看s.split('=')的结果,您应该注意到每个值N-1,后跟度量N.并且,由于值不允许有空格但矩阵名称是,如何将每个元素拆分为值和度量标准是明确的,对吧?那么,这只是将值列表移动一个并将其与度量列表一起压缩的问题。只记住边缘情况(第一个没有值,最后一个没有指标),你应该能够很容易地写这个。

如果您不了解压缩,您也可以明确地执行此操作:

d = {}
for i, part in enumerate(s1.split('=')):
    if i == 0:
        metric = part
    else:
        d[metric], _, metric = part.partition(' ')

但是我强烈建议你试着找出简单的方法,并在遇到问题时寻求帮助。

答案 1 :(得分:1)

你走在正确的轨道上。 re是工作的正确工具。

不要尝试指定匹配的组,而是反转您的模式并使用re.split - 将其视为加强版str.split

我将使用“环视”表达式 - 具体来说,我们希望拆分每个空白字符后跟一个包含=符号的单词。否则称为每个空格后跟一个仅包含字母数字字符的单词。方便的是,我们可以非常紧凑地表达:\s(?=\w+\s)

s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c"""
s1 = """X3 InRXBytes=1257890123 X2 OutRXBytes=871625343 X5 OutRXBytes=71625343"""

import re
pat = re.compile(r'\s(?=\w+\s)')

pat.split(s)
Out[17]: ['X8 ifInDiscards=14308c', 'X8 ifOutDiscards=133796c']

pat.split(s1)
Out[18]: 
['X3 InRXBytes=1257890123',
 'X2 OutRXBytes=871625343',
 'X5 OutRXBytes=71625343']