2012-06-14 66 views
3

我試圖找出如何從一個字符串根據此列表中選取一些數據:提取數據根據列表

check_list = ['E1', 'E2', 'E7', 'E3', 'E9', 'E10', 'E12', 'IN1', 'IN2', 'IN4', 'IN10'] 

例如,對於這個名單:

s1 = "apto E1-E10 tower 1-2 sanit" 

我會得到['E1', 'E10']

s2 = "apto IN2-IN1-IN4-E12-IN10 mamp" 

爲此,我會得到:['IN2', 'IN1', 'IN4', 'E12', 'IN10']

然後這得到棘手:

s3 = "E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr." 

我會得到:['E2', 'E7', 'E3', 'E9', 'E12', 'IN1', 'IN4', 'IN10']

能否請您給一些建議來解決這個問題?

+0

字符串「E-2-7-3」和「E2-7-3」是否都會在結果中產生[['E2','E7','E3']'? –

回答

3

下面應該工作:

def extract_data(s): 
    check_set = set(['E1', 'E2', 'E7', 'E3', 'E9', 'E10', 'E12', 
        'IN1', 'IN2', 'IN4', 'IN10']) 
    result = [] 
    for match in re.finditer(r'\b(E|IN)[-\d]+', s): 
     for digits in re.findall(r'\d+', match.group(0)): 
      item = match.group(1) + digits 
      if item in check_set: 
       result.append(item) 
    return result 

例子:

>>> extract_data("apto E1-E10 tower 1-2 sanit") 
['E1', 'E10'] 
>>> extract_data("apto IN2-IN1-IN4-E12-IN10 mamp") 
['IN2', 'IN1', 'IN4', 'E12', 'IN10'] 
>>> extract_data("E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.") 
['E2', 'E7', 'E3', 'E9', 'E12', 'IN1', 'IN4', 'IN10'] 
+0

看完這個問題後,我很好奇怎麼做。很好的答案,爲你+1! – yasar

+0

謝謝!只有我不太確定的是,如果我有正確的解釋應該如何使用check_list。 –

+0

這完全符合我的需求。謝謝。 –

1
import re 

def parse(string): 
    result = [] 
    for match in re.findall('(E|IN)-{0,1}([\d]+)((-[\d]+)*)', string): 
    letter = match[0] 
    numbers = [int(i) for i in [match[1]] + match[2].split('-')[1:]] 
    for number in numbers: 
     result.append('%s%d' % (letter, number)) 

    return result 


print parse('apto E1-E10 tower 1-2 sanit') 
print parse('apto IN2-IN1-IN4-E12-IN10 mamp') 
print parse('E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.') 
0

這是一個局部的答案,更指示我怎麼可能會開始爲您解決問題。

使用「鍵」INE,我會在字符串中搜索與密鑰匹配的模式,然後輸入任意數量的空格或破折號。

例如:

import re 

S = ['apto E1-E10 tower 1-2 sanit','apto IN2-IN1-IN4-E12-IN10 mamp','E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.'] 

for s in S: 
    print s 
    M = re.findall(r'(IN[\d\-]*)', s) 
    for m in M: print m 

    M = re.findall(r'(E[\d\-]*)', s) 
    for m in M: print m 

產地:

 
$ python extract.py 
apto E1-E10 tower 1-2 sanit 
E1- 
E10 
apto IN2-IN1-IN4-E12-IN10 mamp 
IN2- 
IN1- 
IN4- 
IN10 
E12- 
E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr. 
IN1-4-10 
E-2-7-3-9-12 

我再取每m並進一步解析它。因此E1-導致[E1]E-2-7-3-9-12導致[E2,E7,E3,E9,E12]

0

我試圖使這一儘可能通用:

import re 

def make_relist(l): 
    relist = [] 
    for a in l: 
     alpha, num = re.match('([a-zA-Z]+)(\d+)', a).groups() 
     re_string = r'\b{0}({1}|\d*-(\d+-)*{1})\b'.format(alpha, num) 
     relist.append((a, re.compile(re_string))) 

    return relist 

def extract(s, relist): 
    return [v for v, r in relist if r.search(s)] 

測試:

>>> tokens = ['E1', 'E2', 'E7', 'E3', 'E9', 'E10', 'E12', 'IN1', 'IN2', 'IN4', 'IN10'] 
>>> relist = make_relist(tokens) 
>>> extract("apto E1-E10 tower 1-2 sanit", relist) 
['E1', 'E10'] 
>>> extract("apto IN2-IN1-IN4-E12-IN10 mamp", relist) 
['E12', 'IN1', 'IN2', 'IN4', 'IN10'] 
>>> extract("E-2-7-3-9-12; IN1-4-10 T 1-2 inst. hidr.", relist) 
['E2', 'E7', 'E3', 'E9', 'E12', 'IN1', 'IN4', 'IN10'] 

請注意,如果你有大量的字符串從提取此變得更加有效,因爲在這種情況下,編譯開銷時間變得不重要。