2015-11-05 69 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