2013-03-17 110 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