2015-11-05 70 views
2

我试图提取一个字符串的数字以及之前和之后的字符(不包括数字和空格)。的函数的预期收益是元组的列表,与具有形状的每个元组:使用Python查找与正则表达式重叠的序列

(previous_sequence, number, next_sequence) 

例如:

string = '200gr T34S' 
my_func(string) 
>>[('', '200', 'gr'), ('T', '34', 'S')] 

我的第一次迭代是使用:

def my_func(string): 
    res_obj = re.findall(r'([^\d\s]+)?(\d+)([^\d\s]+)?', string) 

但是这个函数并没有达到我期望的效果,当我传递一个像'2AB3'这样的字符串时,我想输出[('','2','AB'), ('AB','3','')],而是显示[('','2','AB'), ('','3','')],因为'AB'是以前输出的一部分。

我该如何解决这个问题?

+0

您可以检查另一个答案和反馈! – SIslam

回答

1

由于没有重叠的数字,所以你需要一个尾随的
断言。

喜欢的东西([^\d\s]+)?(\d+)(?=([^\d\s]+)?)

([^\d\s]*)(\d+)(?=([^\d\s]*))如果你关心
NULL和空字符串之间的区别。

+0

在你最后一句话中,你的意思是“如果你*不关心”? –

+0

@NiklasB。 - 这是一个棘手的问题,我不知道,可以采取任何方式。 – sln

+0

谢谢!这工作就像一个魅力! – learn2day

1

而是修改+?,你可以简单地使用*

>>> re.findall(r'([^\d\s]*)(\d+)([^\d\s]*)',string) 
[('', '200', 'gr'), ('T', '34', 'S')] 

但如果你的意思是匹配重叠的字符串,你可以使用一个积极的展望精所有重叠比赛:

>>> re.findall(r'(?=([^\d\s]*)(\d+)([^\d\s]*))','2AB3') 
[('', '2', 'AB'), ('AB', '3', ''), ('B', '3', ''), ('', '3', '')] 
+0

似乎在工作,谢谢!秘密是*? – learn2day

+0

@ learn2day没有检查编辑。 – Kasramvd

+0

Kasramvd实际上我需要'2AB3'的输出为[('','2','AB'),('AB','3','')],没有其他重叠匹配。你能帮我解决吗? – learn2day

0

另一种方法可以使用正则表达式和函数!

import re 

#'200gr T34S' '2AB3' 


def s(x): 
    tmp=[] 
    d = re.split(r'\s+|(\d+)',x) 
    d = ['' if v is None else v for v in d] #remove None 
    t_ = [i for i in d if len(i)>0] 
    digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 
    nms = [i for i in t_ if i[0] in digits] 
    for i in nms:  
     if d.index(i)==0: 
      tmp.append(('',i,d[d.index(i)+1])) 
     elif d.index(i)==len(d): 
      tmp.append((d[d.index(i)-1],i,'')) 
     else: 
      tmp.append((d[d.index(i)-1],i,d[d.index(i)+1])) 
    return tmp 

print s('2AB3') 

Prints-

[('', '2', 'AB'), ('AB', '3', '')] 
+0

谢谢,似乎是做这个工作,但是像're.findall(r'([d \ s] +)?(\ d +)(?=([^ \ d \ s] +) ?)',string)'也是我认为更清晰的。 – learn2day