2014-06-18 2 views
0

Я написал код, приведенный ниже, чтобы найти строки в infile, которые соответствуют любому из ключевых слов в файле ключевого слова. Проблема в том, что я хочу получить только те строки infile, которые содержат ВСЕ ключевые слова. Кажется сложнее, чем я думал, но я новичок, поэтому, я думаю, я просто пропустил что-то очевидное. Однако у Regex нет прямого оператора «и».Соответствующие строки с оператором AND в Python

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

Существует не '' и 'регулярных выражений, потому что для регулярных выражений не имеет смысла. Они используются для описания паттернов (языков) и, самое главное, у них есть поток (т. Е. _ «Теперь вы можете прочитать Foo или Bar» _ имеет смысл, _ «теперь вы будете читать Foo ** и ** Bar, в то же время "_ не делает". –

+2

Шаблоны, заданные регулярными выражениями, определяют конкретный порядок; они представляют собой компактный способ описания конечной машины. '' '' Или "позволяет указать два параметра в определенном месте или два возможных состояния (или последовательности состояний), через которые машина может пройти. Поскольку два параметра не могут находиться в одном и том же месте, и машина не может находиться в двух состояниях одновременно, функция «и» не очень полезна. – jpmc26

ответ

3

Регулярные выражения не швейцарский армейский нож, способный решать каждый проблемы. Они не являются хорошим решением этой проблемы:

  1. Там нет никакого способа использовать один операцию регулярного выражения, чтобы сделать такую ​​операцию конъюнкции, которую вы ищете.
  2. Regexp не должны использоваться, чтобы сделать простые текстовые поиски, так как «обычный текст» ключевые слова могут содержать символы, которые вызывают различное поведение в регулярных выражениях (таких как . или $)

Попробуйте это, используя один 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

Regexes не предназначены для использования подобным образом. Вместо этого, вы должны использовать 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) 
Смежные вопросы