2013-03-17 115 views
1

我有一个字符串看起来像这样的列表:查找与Python正则表达式特殊字符

H PL->01 Tx=000/006 Ph=00/000 DGDD DDDR YDyD GRDD YGR Dets=  003,003,003,003,003,003,003,003,003,003,003,003, ports= 255,255,255,255,255,255,255,255,' 

我希望能够提取内容塔匹配DGDD DDDR YDyD GRDD YGR(此变化,但总有字母D,G,R,Y,y和它的长度可能会改变),并把它放在一个列表,而空格是这样的:有至少三个字符

['D', 'G', 'D', 'D', 'D', 'D', 'D', 'R', 'Y', 'D', 'y', 'D', 'G', 'R', 'D', 'D', 'Y', 'G', 'R'] 
+0

是否总是在该行的同一个地方? – 2013-03-17 17:01:53

+0

你想找到序列只包含字符'D','G','R','Y','y'和空格,然后删除空格? – 2013-03-17 17:05:40

+0

@JonClements它始终在同一个地方开始,但不会在同一个地方结束。它可能是16个字符或17或15. – vkefallinos 2013-03-17 17:14:24

回答

3

如果条件是DGRYy组,那么你可以使用正则表达式到效果,然后将“扁平化”,它到...之后的列表中,例如:

import re 
from itertools import chain 
print list(chain.from_iterable(re.findall('[DGRYy]{3,}', data))) 
# ['D', 'G', 'D', 'D', 'D', 'D', 'D', 'R', 'Y', 'D', 'y', 'D', 'G', 'R', 'D', 'D', 'Y', 'G', 'R'] 

如果它总是两个项目之间,那么它可以使用内置的字符串函数来提取它,例如:

print [ch for ch in data[data.index('Ph'):].partition('Dets=')[0].split(' ', 1)[1] if ch != ' '] 
+0

最后3个YGR可以是1或2个字符。如果我使用打印列表(chain.from_iterable(re.findall('[DGRYy] {3,}',data)))与1而不是3,它将提取“ D“的单词”Dets“。有没有办法从Dets中提取D? – vkefallinos 2013-03-17 17:12:34

+0

@vkefallinos它总是五个一组? – 2013-03-17 17:16:57

+0

不,它不总是一组五个。可能有三组四个字符和一组3或2或1.它总是在Ph = ****和Dets – vkefallinos 2013-03-17 17:21:02