【问题标题】:complex string split with multiple spaces用多个空格分割的复杂字符串
【发布时间】:2013-11-23 01:41:13
【问题描述】:

我要解决的问题:

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

【问题讨论】:

  • 问题是如何以最有效的方式拆分字符串?这是我尝试过的另一种方法,但没有成功: >>> 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)
  • @TJonS:它可能会写得更好,但 OP 已经展示了他的尝试。这已经是一个好兆头了。
  • 现在已经编辑了:)
  • +1。感谢您的编辑! :)
  • 最后一次编辑我想出的解决方案,但有没有比我的解决方案更好的方法......???

标签: python string split


【解决方案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(' ')

但我强烈建议尝试找出简单的方法,并在遇到困难时寻求帮助。

【讨论】:

  • 使用字典和分区的方法是最简单的,比使用正则表达式更上一层楼。非常感谢你,我接受你的回答....
【解决方案2】:

你在正确的轨道上。 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']

【讨论】:

  • 此方法无效,因为指标名称中没有空格。它适用于我在问题中提供的两个示例 - 但如果字符串如下所示则不起作用: s1 = '''X3-InRXBytes=1257890123 X2_OutRXBytes=871625343''' 感谢您提供正则表达式方法 :)
猜你喜欢
  • 2012-04-22
  • 2021-06-16
  • 1970-01-01
  • 2011-08-18
  • 2012-09-22
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多