2016-01-26 81 views
0

在Python中我有一長串等(我刪除了所有休息時間)切片子在Python列表

stringA = 'abcdefkey:12/eas9ghijklkey:43/e3mnop' 

我想要做的是搜索這個字符串的"key:"所有出現,然後提取"key:"後面的「值」。我 一個更爲複雜的是,我不知道屬於關鍵這些價值有多長(例如key:12/eas9key:43/e3)。我所知道的是,他們不得不以數字結尾,而字符串的其餘部分不包含任何數字。

這就是爲什麼我的想法是從key指數加上下一切片說10個字符(例如key:12/eas9g),然後向後工作,直到isdigit()是假的。

我試圖分裂我的初始字符串(也的確含有休息時間):

stringA_split = re.split("\n", stringA) 

for linex in stringA_split: 
    index_start = linex.rfind("key:") 
    index_end = index_start + 8 
    print(linex[index_start:index_end] 
    #then work backward 

然而,插入換行符不以任何方式幫助,因爲他們是從PDF到TXT轉換毫無意義。

那麼將如何解決這個問題(例如與獲得的各項指標開始「‘關鍵’」和這片到一個列表)?

回答

2
import re 

>>> re.findall('key:(\d+[^\d]+[\d])', stringA) 
['12/eas9', '43/e3'] 

\d+#一個或多個數字。

[^\d]+#一切除(相當於[\D])數字。

[\d]#最後一位

(\d+[^\d]+[\d])#以上

'key:(\d+[^\d]+[\d])'# '鍵:' 該組的表達,隨後該組表達

如果你在你的結果要key:

>>> re.findall('(key:\d+[^\d]+[\d])', stringA) 
['key:12/eas9', 'key:43/e3'] 
2

我不是100%肯定我明白你什麼定義的值的定義,但我認爲這將讓你你所描述的

import re 
stringA = 'abcdefkey:12/eas9ghijklkey:43/e3mnop' 
for v in stringA.split('key:'): 
    ma = re.match(r'(\d+\/.*\d+)', v) 
    if ma: 
     print ma.group(1) 

這將返回:

12/eas9 
43/e3 
2

你可以適用於只是一個RE是獲取所有按鍵成元組的數組:

import re 
p=re.compile('key\:(\d+)\/([^\d]+\d)') 
ret=p.findall(stringA) 

執行後,你哈ve:

ret 
[('12', 'eas9'), ('43', 'e3')] 
0

編輯:上面貼出了一個更好的答案。在提出在這裏撤銷時,我誤解了原來的問題,這確實沒有必要。祝你好運!

如果您知道該格式永遠是關鍵:,如果你顛倒的字符串和雷克斯:YEK?你會隔離所有鍵,然後可以逆轉回

import re 
# \w is alphanumeric, you may want to add some symbols 
rex = re.compile("\w*:yek") 

word = 'abcdefkey:12/eas9ghijklkey:43/e3mnop' 
matches = re.findall(rex, word[::-1]) 
matches = [match[::-1] for match in matches]