2015-09-02 1 views
0

Например,Каков самый быстрый способ сделать эту замену паттен строки на основе логических отношений в Python?

1. str1 = 'A>1 and A>=3 and B<2 and B<=3 and B<1 ...', should be substituted to: 
    str1 = 'A>=3 and B<1 ...'; 

2. str2=['A=1 and B<=2 ...', 'A=1 and B>2 ...'], should be substituted to: 
    str2=['A=1 ...'], where B is skipped 

А, В может быть любая длина идентификаторы юридического Python. Существует неизвестное количество логических операндов в str1 и str2.

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

EDIT:

Для того, чтобы этот вопрос просто, давайте рассмотрим 'и' только операция, и все операнды сортируются в виде строки, а именно

'A<x and A<y and A<z' will always appear next to each other 
+0

Я действительно не вижу, как вы можете решить это с помощью регулярного выражения. Я бы сказал, вам нужно проанализировать ваши строки (этот шаг можно выполнить с помощью регулярного выражения, если ваш формат достаточно ограничен) и запустить простой интерпретатор результата. – fjarri

ответ

1
from itertools import groupby 
import re 


str1 = "A>1 and A>3 and B<2 and B<3" 
comparisions = [s.strip() for s in str1.split("and")] 
operands = [re.search(r'(\w+)([<>][=]?)(\w+)',c).groups() for c in comparisions]# 

tot={}#total results 
for k,g in groupby(operands,lambda x:x[0]):#group by variable1 
    for arg in g:#arg is the match with list [var1,compareitem,var2] 
     if k not in tot:tot[k] = {} 
     if arg[1] in tot[k]: 
      print("do the overwrite handling!") 
     tot[k][arg[1]] = arg[2] 

#sort tot 
sortedkeys = sorted(tot, key=lambda x: x[0]) 

resub_str = " and ".join([comp+"".join([k+tot[comp][k] for k in tot[comp]]) for comp in sortedkeys]) 
print(resub_str) 

Выход:

do the overwrite handling! 
do the overwrite handling! 
A>3 and B<3 

Идея:

  1. Разделить строку в массиве условных операторов. Итак, у нас есть [A>1,A>3,B<2,B<3] и так далее.
  2. Поиск каждое условие с рисунком, который соответствует [Variable1] [COMPARE_ITEM] [Variable2], где COMPARE_ITEM является одним из <,>,<=,>=
  3. теперь группа по VARIABLE1 и искать результаты, если у нас уже есть условие VARIABLE1. Если у нас есть - сделайте переписку. Если нет, просто вставьте его.
  4. Сортировка массива по VARIABLE1 и присоединиться условие части с " and "

Вы можете улучшить код, не просто поиск var1, но поиск также для variable2 и создать ссылку для каждой переменной, используемой.

(Так что такие условия, как A<B and A< 4, то же самое, что и B>A and 4>A).

+0

супер прохладный! Любой взлом для второй части вопроса? – Rex

+0

Поработайте сами, это не должно быть так сложно. Я объясню, что моя идея была, если вы хотите. Вы можете применить эту идею ко второй части – user2358582

+0

Можете ли вы объяснить свою идею выше? – Rex

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

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