2013-11-23 42 views
3

我试图解决的问题:复杂的字符串分割与多个空格

s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c""" 
s1 = """X3 InRXBytes=125789X2 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') 
+0

问题是如何以最有效的方式拆分字符串? 这里有一个我试过没有运气的方法: >>> 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) –

+0

@TJonS:写起来可能会好很多,但是OP已经展示了他的尝试。这已经是一个好兆头。 – user2357112

+0

已被编辑:) –

回答

1

如果你看看s.split('=')的结果,你应该注意到每个值为N-1,其次是度量N.并且,si这些值不允许有空格,但矩阵名称是,如何将每个元素拆分为值和度量标准是明确的,对吗?那么,只需要将值列表转换为一个值并将其与指标列表一起压缩即可。记住边缘案例(第一个没有价值,最后一个没有指标),你应该能够很容易地写出这个边缘案例。

如果你不明白荏苒,你也可以做到这一点明确:

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

但我强烈建议,试图找出最简单的方式,并寻求帮助,如果你会被卡住。

+0

使用字典和分区的方法是使用正则表达式的最简单方法。非常感谢你,我接受你的回答.... –

1

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

而不是试图指定匹配组,反转你的模式,并使用re.split - 认为它是一个加强str.split

我将使用“lookaround”表达式 - 具体而言,我们要分割每个空格字符,后跟不包含包含=符号。否则称为每个空格后跟一个字只包含字母数字字符。方便的是,我们可以非常简洁地表达:\s(?=\w+\s)

s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c""" 
s1 = """X3 InRXBytes=125789X2 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'] 
+0

这种方法不起作用,是指标名称中没有空格。它适用于我在问题中提供的两个示例 - 但如果字符串如下所示不起作用:s1 ='''X3-InRXBytes = 125789X2_OutRXBytes = 871625343''' 感谢您提供regex方法:) –