2016-01-26 173 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]