2017-10-19 4 views
0

나는 어휘집을 포함하는 목록의 목록을 가지고 있습니다. "(atè | atwa | atif) $"와 같은 문자 패턴이 포함되지 않은 어휘집이 있으면 목록에서 목록을 삭제하고 싶습니다. 예를 들어 :목록에있는 단어 중 하나에 파이썬에서 특정 문자가 포함되어 있지 않으면 목록을 삭제하는 방법은 무엇입니까?

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.은 변수 이름을 지정하지 마십시오 것과 같은 list, dict, str 등이다 내장 당신은 내부 목록에서 패턴을 검색하려고하기 때문에 표시되는 오류는 파이썬 데이터 유형

+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 분이 걸리기 때문에 중첩 루프를 사용하지 않으려 고하지만 목록의 간단한 목록에서 시도해 보겠습니다. –

관련 문제