我的输入像key: "a word"
或像anotherkey: "a word (1234)"
一样给出。我的问题是我使用了以下语法:
word = pp.Word(pp.printables, excludeChars=":")
word = ("[" + pp.Word(pp.printables + " ", excludeChars=":[]") + "]") | word
non_tag = word + ~pp.FollowedBy(":")
# tagged value is two words with a ":"
tag = pp.Group(word + ":" + word)
# one or more non-tag words - use originalTextFor to get back
# a single string, including intervening white space
phrase = pp.originalTextFor(non_tag[1, ...])
parser = (phrase | tag)[...]
当我的输入类似于key: "value1" and hey you how are you?
时,它将查询转换为([(['key', ':', '"value1"'], {}), 'and hey you how are you?'], {})
的预期输出,但当我尝试在键后的值之间留有空格时,就会出现问题:
parser.parseString('key: "Microsoft windows (12932)" and hey you how are you?')
([(['key', ':', '"Microsoft'], {}), 'windows (12932)" and hey you how are you?'], {})
它在Microsoft
和windows
上中断。我知道pyparsing忽略了空格,但是我如何解决这个问题并得到结果,直到短语的末尾,也就是双引号
编辑-1 我试图通过添加另一个单词来解决此问题,如下图所示:
word = ('"' + pp.Word(pp.printables + " ", excludeChars=':"') + '"') | word
它适用于像key: "windows server (23232)"
这样的查询,但不适用于像key1: value and key2: "windows server (1212)"
这样更复杂的查询。有人对这个问题有任何线索吗?我应该如何避免这种错误行为
编辑-2我期望什么?我需要的是扩展我的语法,如下所示:
'key: "Microsoft windows (12932)" and hey you how are you?
它不应该是:
([(['key', ':', '"Microsoft'], {}), 'windows (12932)" and hey you how are you?'], {})
应该是这样的:
([(['key', ':', '"Microsoft windows (12932)"'], {}), 'and hey you how are you?'], {})
此查询可以通过以下自由文本搜索与更多键组合:
A free text search and key1: "Microsoft windows (12312) and key2: "Sample2" or key3: "Another sample (121212)"
这也应该得到如下解析:
part1-> A free text search and
part2: ['key1', ':', '"Microsoft windows (12932)"']
part3: ['key2', ':', '"Sample2"']
part3: ['key3', ':', '"Another sample (121212)"']
注意:如果and
,or
附加到令牌上,对我来说没问题我只需要将自由文本搜索与关键字:值查询分开。
我通常不鼓励人们写包含空格作为有效单词字符的
Word
。 这样做会禁用大多数先行规则或关键字匹配。这就是为什么“和”和“或”被包括在内 在搜索词中,即使它们可能应该是逻辑运算符如果这应该是一个搜索字符串,那么从编写用于执行搜索的BNF开始:
这将重用几个表达式,就像您定义它们一样。你肯定是 在正确的轨道与你的一些表达,如非标签和短语。东西在哪里 当您试图通过扩展
word
来处理带引号的字符串时,情况变得糟糕了 表情我们还需要以一种不匹配任何运算符的方式定义单词 关键词“和”、“或”或“不是”。因此,我们首先为它们创建表达式:
我们还将定义一个表达式来专门处理带引号的字符串 (而不是在
word
中添加“和””):以下是BNF翻译成pyparsing解析器的第一部分:
然后,为了使用“and”、“or”和“not”作为操作符(BNF的最后一部分)将事物联系在一起,我们使用 pyparsing的
infixNotation
方法。看起来您想使用“[]”作为分组 字符,因此我们可以将它们指定为默认“()”分组字符的覆盖我们首先使用 BNF:
然后使用infixNotation来定义搜索表达式的外观 术语:
使用
search_expr
作为解析器,下面是解析测试字符串的结果:印刷品:
要实际评估这些解析结果,请参考pyparsing examples目录中的simpleBool.py示例
相关问题 更多 >
编程相关推荐