2017-10-19 124 views
0

我有一个包含词典的列表列表。 我想从列表中删除列表,如果他们的词典不包含“(atè| atwa | atif)$”等字符模式。例如:如果从列表中删除一行,如果其中的一个单词不包含Python中的某些字符?

list = [['blablatè', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 

预期的结果将是:

[['blablatè', 'blabla'], ['matwa', 'mat'], ['ratif']] 

我以为我可以用一个循环,并re.search()做它,但它不工作。这里是我的代码:

import re 
result = [['blablatè', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 
rendp = "(atè|atwa|atif)$" 
for row in result : 
    if re.search(rendp, row) == None : 
     result.remove(row) 
joined = '\n'.join(' - '.join(map(str, row)) for row in result) 
print(joined) 

这里的错误:

Traceback (most recent call last): 
    File "C:\Users\alice\OneDrive\Documents\Visual Studio 2017\Projects\CréoleDB\CréoleDB\CréoleDB.py", line 65, in <module> 
    if re.search(rendp, row) == None : 
    File "C:\Users\alice\Anaconda3\lib\re.py", line 182, in search 
    return _compile(pattern, flags).search(string) 
TypeError: expected string or bytes-like object 

我真的可以使用一些帮助。非常感谢 !

+0

你看到的错误是因为你正在尝试搜索内部列表中的模式。只有在字符串中搜索模式时,re.search才起作用。 – suripoori

回答

1

随着re.compile()regex.search()any()功能:

import re 

lists = [['blablaté', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 
pat = re.compile(r'(até|atwa|atif)$') # compiled regular expression object 
result = [l for l in lists if any(pat.search(i) for i in l)] 

print(result) 

输出:

[['blablaté', 'blabla'], ['matwa', 'mat'], ['ratif']] 

P.S.请不要给你的变量名称为listdictstr等,这些都是内置Python数据类型

+0

@AlicePhoenix,不客气 – RomanPerekhrest

+0

woops,我的评论尚未发布......非常感谢,它完美的作品:) –

1

目前,您正在通过一个列表(row)到re.search;然而,只有一个字符串可以用于模式匹配。尝试使用理解过滤列表:

import re 
result = [['blablaté', 'blabla'], ['klak'], ['matwa', 'mat'], ['ma', 'mat'], ['ratif']] 
rendp = "(até|atwa|atif)$" 
final_list = [i for i in result if any(re.findall(rendp, b) for b in i)] 

输出:

[['blablaté', 'blabla'], ['matwa', 'mat'], ['ratif']] 
1

您所看到的错误是因为你试图寻找内部列表模式。只有在字符串中搜索模式时,re.search才起作用。你可以尝试像这样嵌套循环:

for word_list in result: 
    for word in word_list: 
     if re.search(rendp, word) == None: 
      word_list.remove(word) 
+0

感谢您的解释!我试图避免使用嵌套循环,因为我的脚本已经花费了20分钟的时间来运行,因为它在数据库上工作,但我会在列表的简单列表上尝试。 –

相关问题