2015-10-05 46 views
1

我如何分割线下方。如何找到一个字符的索引空间后,蟒蛇

实施例:

"DHCP discover messages : 20  DNS Requests : 20" 

我想要的输出使用正则表达式是

['DHCP discover messages', '20', 'DNS Requests', '20' ] 
+0

你怎么知道在哪里进行分割?有时候你正在分割空白,有时候在':'(带有周围的空白),有时你不会在有空白的时候分割。例如,为什么要在'20'和'DNS'之间进行分割,而不是在'DNS'和'Requests'之间进行分割? – ShadowRanger

+1

这也假设介于20和DNS之间的区域不是TAB字符,我认为... –

+0

这就是它的工作原理。 –

回答

1

如果整条生产线由几个文字:数字对,先拆应当在每个冒号完成。

然后将除了第一个和最后一个所有部件应在第一空白进行分割。

实施例的输入字符串:

"t 1 : n1 t t 2 : n2 t t t 3 : n3" 

第一split(':')后:

["t 1 ", " n1 t t 2 ", " n2 t t t 3 ", " n3"] 

split(None, 1)上除了第一所有元素,最后一个后:

["t 1 ", ["n1", "t t 2 "], ["n2", "t t t 3 "], " n3"] 

最后压平列出并修剪任何额外的空格:

["t 1", "n1", "t t 2", "n2", "t t t 3", "n3"] 

编辑:代码示例:

def mysplit(line): 
    split1 = line.split(':') 
    last = len(split1) - 1 
    for i, t1 in enumerate(split1): 
     if i == 0 or i == last: 
      yield t1.strip() 
     else: 
      for t2 in t1.split(None, 1): 
       yield t2.strip() 

testline = "t 1 : n1 t t 2 : n2 t t t 3 : n3" 
testsplit = list(mysplit(testline)) 
print(testsplit) 
# prints ['t 1', 'n1', 't t 2', 'n2', 't t t 3', 'n3'] 
+0

非常感谢。这正是我所期待的。 –

+0

嗨,我如何走到最后一步? '[“n1”,“t t 2”]'显示为单个元素。但是,我希望它像最后一步那样分开。除了以** newlist [0] [0] **和'** newlist [0] [1] * * –

+0

@RakeshNittur:你可以搜索“Python list flattening”,它已经被回答了很多次。但是,您可以在创建列表时处理此问题。查看我添加到答案的示例代码。 – VPfB

1

简单例子。

print([ 
    (l.strip(), v.strip()) 
    for l, v in re.findall(
     "(?P<label>[^:]+):(?P<value>[ 0-9]+)", 
     example 
    ) 
]) 
[('DHCP discover messages', '20'), ('DNS Requests', '20')] 
+0

OP也想找到匹配的索引(我认为) – CoryKramer

+0

@CoryKramer“我需要获取后面的数字”:“。”。 - 他需要的是价值观,而不是指数。他认为子串是实现它的唯一方法。 – TkTech

+0

@ TkTech我可以将元素分割到单个列表中吗? –

2

你可以这样做:

import re 

str = 'DHCP discover messages : 20  DNS Requests : 20' 

[l.strip() for l in re.sub(r'(\d+) +(\w)', r'\1:\2', str).split(':')] 

#['DHCP discover messages', '20', 'DNS Requests', '20'] 
+0

'l'''''是古老的(在Py2中不推荐使用,而在Py3中不存在),当'l'是'str'时你没有意义,只要测试'if l'而不与任何东西进行比较空的'str'是虚的,非空的是真的)。此外,踩坏'str'真是糟糕的形式; 'astr','mystr','s';这些都比'str'好(这会影响对'str'构造函数的访问)。 – ShadowRanger

+0

如果列表理解中的条件稍微好一点的正则表达式以获得所需的结果,我将其抑制。不过,我提醒你'如果我'! –

1
import re 
x="DHCP discover messages : 20  DNS Requests : 20" 
print [i for i in re.split(r"\s*:\s*\b(\d+\b)\s*",x) if i] 

输出:['DHCP discover messages', '20', 'DNS Requests', '20']