2017-02-22 68 views
0

У меня много текстов в списке, и я хочу сделать расширенный поиск по этим текстам, чтобы найти конкретные записи. Например, я хочу ввести текстовое поле, например, следующие запросы: '(aaa или bbb) и (ccc или ddd или eee)', и я хочу найти соответствующие записи списка, содержащие эти критерии.Поиск в строке из логического выражения в python

Так что мой метод поиска будет делать что-то вроде этого:

# '(aaa or bbb) and (ccc or ddd or eee)' 
    results = [] 
    for text in textlist: 
     if (text.find('aaa') != -1 or text.find('bbb') != -1) and (text.find('ccc') != -1 or text.find('eee') != -1 or text.find('fff') != -1): 
     results.append(text) 

Я не знаю, как разобрать мой поиск и преобразование его, если заявление со многими методами найти.

Во-первых, есть ли лучший способ кодировать мой поиск? более оптимизирован? с библиотекой? Во-вторых, как разобрать поиск? и как построить if?

Я использовал Pyparsing nestedExpr метода для разбора моего запроса, и я получил этот список: [[ 'AAA', 'или', 'BBB'], 'и', [ 'CCC', 'или', 'ddd', 'or', 'eee']]

Вопрос в том, как его проанализировать и получить эффективный поиск? например, регулярное выражение?

редактировать:

ОК, так что я есть это выражение: «а или (б или в) и (д или е или е, или г) или ч нет (я или к)»

И вот, я получаю эту структуру: ['a', 'or', ['b', 'or', 'c'], 'and', ['d', 'or', 'e', 'или', 'f', 'или', 'g'], 'или', 'h', 'not', ['i', 'or', 'j']]

Как я могу проанализировать это, чтобы создать регулярное выражение? Есть ли простой способ поиска всех этих терминов, кроме регулярного выражения? потому что это, кажется, трудно построить регулярное выражение ...

+0

Вы захотите изучить [регулярные выражения] (https://en.wikipedia.org/wiki/Regular_expression), доступные в Python через модуль '' re' '(https://docs.python.org /3/library/re.html). – kazemakase

+0

Регулярные выражения это звонит колокол? –

+0

Я не знаю, как преобразовать строку типа '(aaa или bbb) и (ccc или ddd или eee)' в регулярное выражение ... ' – emurb

ответ

0
def main(input_list): 
    stack = [] 

    for item in input_list: 
     if item == ')': 
      temp_list = [] 
      while True: 
       stack_item = stack.pop() 
       if stack_item == '(': 
        stack.append(temp_list) 
        break 
       else: 
        temp_list.insert(0, stack_item) 
     else: 
      stack.append(item) 

    return stack[0] 

Вот некоторые примеры:

In [6]: input_list = '((aaa or bbb) and (ccc or ddd or eee))' 

In [7]: main(input_list.split()) 
Out[7]: [['aaa', 'or', 'bbb'], 'and', ['ccc', 'or', 'ddd', 'or', 'eee']] 

In [8]: input_list = '(aaa or bbb)' 

In [9]: main(input_list.split()) 
Out[9]: ['aaa', 'or', 'bbb'] 

In [10]: input_list = '()' 

In [11]: main(input_list.split()) 
Out[11]: [] 

Я сделал некоторые предположения, что все скобки появляются парами и каждый символ с независимыми потребностями смысловых пространственный раздел.

 Смежные вопросы

  • Нет связанных вопросов^_^