2014-06-18 3 views
0

키워드 파일의 모든 키워드와 일치하는 infile 행을 찾는 코드를 작성했습니다. 문제는 모든 키워드가 포함 된 infile의 줄만 가져오고 싶습니다. 내가 생각했던 것보다 열심히 보인다. 그러나 나는 초심자 다. 그래서 나는 명백한 무엇인가를 놓치고 있다고 생각한다. Regex는 '연산자'가 간단하지는 않습니다.Python에서 AND 연산자로 일치하는 행

import re 
infile = open('path/#input.txt', 'r') 
outfile = open('path/#output.txt', 'w') 

# Read a textfile containing keywords to find 
# (and strip the newline character '\n') 
keywords = [line.strip() for line in open('path/#keywords.txt')] 

# Compile keywords into a regex pattern 
pattern = re.compile('|'.join(keywords)) 

# See which lines in the infile match any of the keywords 
# and write those lines to the outfile 
for line in infile: 
    if pattern.search(line): 
     outfile.write(line) 
+3

왜이 작업에 정규식을 사용하기로 선택 했습니까? – kindall

+2

regexes에 'and'가 없기 때문에 정규 표현식이 없습니다. 그들은 패턴 (언어)을 설명하는 데 사용되며, 가장 중요한 것은 흐름이 있습니다 (예 : _ "이제 Foo 또는 Bar 중 하나를 읽을 수 있음"_ 의미 있음, _) 이제 Foo ** 및 ** Bar를 읽습니다. 같은 시간 "_하지 않습니다). –

+2

정규 표현식으로 지정된 패턴은 특정 순서를 정의합니다. 그들은 상태 기계를 기술하는 간결한 방법입니다. '| ' "또는"는 특정 위치에 두 가지 옵션을 지정하거나, 머신이 통과 할 수있는 두 가지 상태 (또는 상태 시퀀스)를 지정할 수있게합니다. 두 옵션은 같은 위치에있을 수 없으며 컴퓨터가 동시에 두 가지 상태가 될 수 없으므로 "and"기능은별로 유용하지 않습니다. – jpmc26

답변

3

정규 표현식은 모든 문제를 해결할 수있는 스위스 군용 칼이 아니다.

  1. 당신이 찾고있는 연동 해 작업의 종류를 할 하나 정규 표현식 작업을 사용하는 방법은 없습니다 : 그들은이 문제에 대한 좋은 해결책이 아니다. 은 "일반 텍스트"키워드이 시도으로 정규 표현식 (예 : . 또는 $)

에서 다른 동작을 트리거 문자를 포함 할 수 있기 때문에

  • 정규 표현식 사용, 일반 텍스트 검색을 수행하는 데 사용되어서는 안된다 다른 하나 개의 내부 for 루프는 각 라인에 대한 모든 키워드를 반복합니다 :

    keywords = ... 
    
    for line in infile: 
        # iterate through ALL the keywords 
        found_all = True 
        for kw in keywords: 
         # if ANY keyword is not found, found_all = False 
         if kw not in line: 
          found_all = False 
    
        if found_all: 
         outfile.write(line) 
    

    는 UPDATE : @Stefano 대해 Sanfilippo의 솔루션은 같은 일을보다 간결 버전입니다. :)

  • +1

    하지만 특수 문자의 위험에 대해서는 언급하지 않았습니다. +1 – jpmc26

    6

    정규식은 그런 용도로 사용되지 않습니다. 대신 all()을 사용해야합니다

    infile = open('path/#input.txt', 'r') 
    outfile = open('path/#output.txt', 'w') 
    
    keywords = [line.strip() for line in open('path/#keywords.txt')] 
    
    for line in infile: 
        if all(k in line for k in keywords): 
         outfile.write(line) 
    
    관련 문제