2017-05-06 65 views
-1

我在嘗試驗證列表中的每個字符串在另一個列表中至少存在一次。我一直在困擾的問題是字符串永遠不會完全匹配,所以我需要某種形式的正則表達式/通配符。有沒有一種方法來驗證一個列表中的每個項目至少存在一次從另一個列表中存在一次?

must_have_list = ['APPLE SSD', 'APPLE HDD'] 
example_device_list = [u'APPLE SSD SM128E', u'APPLE HDD HTS541010A9E662'] 
example_device_list2 = [u'APPLE SSD SD0128F', u'APPLE HDD ST3000DM001'] 

的想法是返回True如果給定的設備列表包含must_have_list每個設備串的至少一個。如果給定的設備列表僅包含在must_have_list的項目之一(或無),然後返回False

[u'APPLE SSD SM128E', u'APPLE HDD HTS541010A9E662'] 

True各一個發現

[u'APPLE HDD HTS541010A9E662', u'APPLE HDD HTS541010A9E662'] 

False只有2個APPLE HDD發現,沒有APPLE SSD上市

[u'APPLE HDD HTS541010A9E662', u'APPLE HDD HTS541010A9E662', u'APPLE SSD SM128E'] 

True其中每一個發現,甚至噸霍夫有不止一個APPLE HDD

[u'APPLE SSD SM128E'] 

False只有APPLE SSD上市,沒有APPLE HDD上市

如何使用正則表達式來驗證一個列表中每個項目在另一列表中存在?

+1

什麼是你的問題? – mkrieger1

+0

你想使用正則表達式來查找字符串模式嗎?爲什麼你的資料照片?你想看到世界在烈焰中燃燒嗎? profaner;)(只是在開玩笑) –

+1

如果你只是使用[any和all?](https://docs.python.org/3/library/functions.html)而不是're.sub'會怎麼樣? ' 在_list [example_device_list,example_device_list2]: 所有([任何(我在must_have_list j適用於_list j),其中i]) ' – 2017-05-06 01:47:48

回答

1

如果,在你的榜樣,模式進行測試始終是字符串的初始部分,它是有點簡單:

for must_have in must_have_list: 
    notInList = True 
    for example in example_device_list: 
     if example.startswith(must_have): 
      notInList = False 
      break 
    if notInList: return False 
return True 

如果它可以是一個內部串,那麼你」 d必須使用must_have in example而不是startswith,這會增加算法的複雜性。

其他優化將刪除一個示例設備,發現它不會對其他必備項進行測試。

最後,您可以將整個過程從裏面翻出來,遍歷每個示例設備上的示例列表,刪除必須找到的示例的前綴,直到沒有必須離開。根據必須列表和示例列表的大小,將必須複製到新詞典(或從集合中設置)以提高搜索時間是有意義的。

1

不使用regex。這是使用str.startswith()你的問題的方法:

def check (a=list, b=list): 
    checked = [] 
    for k in a: 
     c = False 
     for j in b: 
      if j.startswith(k): 
       c = True 
       break 
     checked.append(c) 
    return all(checked) 

# inputs 
must_have_list = ['APPLE SSD', 'APPLE HDD'] 
example_device_list = ['APPLE SSD SM128E', 'APPLE HDD HTS541010A9E662'] 
example_device_list2 = ['APPLE SSD SD0128F', 'APPLE HDD ST3000DM001'] 
example_device_list3 = ['APPLE ASD SD0128F', 'APPLE HDD ST3000DM001'] 
example_device_list4 = ['APPLE SSD SD0128F', 'APPLE ADD ST3000DM001'] 
example_device_list5 = ['APPLE HDD HTS541010A9E662', 'APPLE HDD HTS541010A9E662', 'APPLE SSD SM128E'] 

# Some tests with this lists 
check_list = check(must_have_list, example_device_list) 
check_list2 = check(must_have_list, example_device_list2) 
check_list3 = check(must_have_list, example_device_list3) 
check_list4 = check(must_have_list, example_device_list4) 
check_list5 = check(must_have_list, example_device_list5) 

# Outputs 
print "All items of %s exists at least once in %s: %r" % ("must_have_list", "example_device_list", check_list) 
print "All items of %s exists at least once in %s: %r" % ("must_have_list", "example_device_list2", check_list2) 
print "All items of %s exists at least once in %s: %r" % ("must_have_list", "example_device_list3", check_list3) 
print "All items of %s exists at least once in %s: %r" % ("must_have_list", "example_device_list4", check_list4) 
print "All items of %s exists at least once in %s: %r" % ("must_have_list", "example_device_list5", check_list5) 

輸出:

All items of must_have_list exists at least once in example_device_list: True 
All items of must_have_list exists at least once in example_device_list2: True 
All items of must_have_list exists at least once in example_device_list3: False 
All items of must_have_list exists at least once in example_device_list4: False 
All items of must_have_list exists at least once in example_device_list5: True 
0

您可以使用allany來測試你的條件:

must_have_list = ['APPLE SSD', 'APPLE HDD'] 
examples=[[u'APPLE SSD SM128E', u'APPLE HDD HTS541010A9E662'], 
      [u'APPLE SSD SD0128F', u'APPLE HDD ST3000DM001'], 
      [u'APPLE HDD HTS541010A9E662', u'APPLE HDD HTS541010A9E662', u'APPLE SSD SM128E'], 
      [u'APPLE SSD SM128E'], 
      [u'APPLE SSD SM128E',u'APPLE SSD SM128E']] 

for ex in examples: 
    print ex, all(any(r in s for s in ex) for r in must_have_list) 

打印:

[u'APPLE SSD SM128E', u'APPLE HDD HTS541010A9E662'] True 
[u'APPLE SSD SD0128F', u'APPLE HDD ST3000DM001'] True 
[u'APPLE HDD HTS541010A9E662', u'APPLE HDD HTS541010A9E662', u'APPLE SSD SM128E'] True 
[u'APPLE SSD SM128E'] False 
[u'APPLE SSD SM128E', u'APPLE SSD SM128E'] False 

可與列表理解可以用來產生符合條件的列表:

>>> [ex for ex in examples if all(any(r in s for s in ex) for r in must_have_list)] 
[[u'APPLE SSD SM128E', u'APPLE HDD HTS541010A9E662'], [u'APPLE SSD SD0128F', u'APPLE HDD ST3000DM001'], [u'APPLE HDD HTS541010A9E662', u'APPLE HDD HTS541010A9E662', u'APPLE SSD SM128E']] 

一個正則表達式是不是在這種情況下必須的,但如果測試每個字符串需要它,你可以使用re.search而非in

例如,假設你想知道的是,測試中的子獨自不是站在一個單詞的一部分像SSDHYBRID

for ex in examples: 
    print ex, all(any(re.search(r'\b{}\b'.format(r), s) for s in ex) for r in must_have_list) 
# same output... 
相關問題