Есть ли библиотека или спецификации для анализа сложных запросов на основе строк

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

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

Я бы сортировал dataframe по столбцу 'name', устанавливал индекс таким образом и, если необходимо, не удалял столбец.

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

Итак:

# sort the dataframe
df.sort(columns=['name'], inplace=True)
# set the index to be this and don't drop
df.set_index(keys=['name'], drop=False,inplace=True)
# get a list of names
names=df['name'].unique().tolist()
# now we can perform a lookup on a 'view' of the dataframe
joe = df.loc[df.name=='joe']
# now you can query all 'joes'
0
задан dlrust 16 January 2019 в 22:30
поделиться

1 ответ

С любой приличной библиотекой общего синтаксического анализа вы можете создать синтаксический анализатор, который анализирует языки, подобные этому Поскольку это язык выражений, я бы предложил использовать некоторый восходящий алгоритм с декларативной ассоциативностью и спецификацией приоритета.

Например, в Parglare (раскрытие: я автор) это будет что-то вроде:

from parglare import Grammar, Parser

grammar = r'''
S: E EOF;
E: Term | And | Not | Or | To | Parent;
And: left=E 'AND' right=E;
Or: left=E 'OR' right=E;
Not: 'NOT' val=E;
To: from=E 'TO' to=BASETYPE;
Parent: '(' E ')' {9};
Term: name=ID TermOp value=BASETYPE {10};
TermOp: ':' | '=' | '>' | '<' | '<=' | '>=';
BASETYPE: NUM | STRING | ID;

terminals
NUM: /\d+(\.\d+)?/;
ID: /[a-zA-Z_][_a-zA-Z0-9]*/;
STRING: /("(\\"|[^"])*")|(\'(\\\'|[^\'])*\')/;
'''

g = Grammar.from_string(grammar)
parser = Parser(g)

out = parser.parse(r'''
available = 1 AND (category:Book OR NOT category:Ebook)
     AND _tags:published
     AND publication_date:1441745506 TO 1441755506
     AND inStock > 0 AND author:"John Doe"
''')

out ссылка в конце будет хорошим объектом Модель выведена из грамматики выше. Вы можете исследовать это в отладчике, чтобы почувствовать. Я не охватил весь язык, так как не знаю, но вы поняли.

Теперь было бы относительно легко расширить этот пример для поддержки полного языка и сделать отображение данной структуры для запроса.

Было бы еще проще, если бы вы использовали parglare действия для непосредственного преобразования анализируемого ввода в желаемый вывод. Вы можете прочитать больше об этом в документах .

0
ответ дан Igor Dejanović 16 January 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: