gpt4 book ai didi

python - Pyparsing 左侧为Optional

转载 作者:行者123 更新时间:2023-12-01 04:03:57 30 4
gpt4 key购买 nike

我有这样的东西

IDENTIFIER = Word(alphas + '_', alphanums + '_') #words
GENERIC_TYPE = Regex('[a-zA-Z_]+[a-zA-Z0-9_]*(\<[a-zA-Z0-9_]+\>)?') #List<string> or int
AMF = Keyword('public') | Keyword('private') | Keyword('protected') #method modifier
SFMF = Optional(Keyword('static')) & Optional(Keyword('final')) #static and final modifiers

对于这个例子:

res = (Optional(AMF) + 
SFMF +
IDENTIFIER).parseString('Method')
print(res)

它打印:['Method'],但如果我添加Optional(GENERIC_TYPE):

res = (Optional(AMF) +
SFMF +
Optional(GENERIC_TYPE) +
IDENTIFIER).parseString(text)
print(res)

它为 text='int Method' 打印 ['int', 'Method'],但为 'final Method' 引发异常>(或只是“方法”):

pyparsing.ParseException: Expected W:(abcd...,abcd...) (at char 12), (line:1, col:13)

看起来 pyparsing 没有看到可选的东西,因为如果 GENERIC_TYPE 是可选的(就像它之前的很多东西一样),它应该进一步解析 IDENTIFIER 部分。

更新:

问题似乎出在解析逻辑上。如果有两个相等的模式,并且其中一个是可选的,那么解析器不会检查它是否与第二个有关。例如:

m = Optional('M') + Literal('M')
m.parseString('M')

解析器将“M”与第一部分匹配,然后错过非可选文字部分。

所以现在的问题是我可以解析它以便它与第二个匹配。它可能不在字符串或行的末尾,所以我不能使用它。

最佳答案

我会说,“GENERIC_TYPE 后面必须跟有 IDENTIFIER”。因此,要解决语法问题,请重写 res如:

res = (Optional(AMF) +
SFMF +
Optional(GENERIC_TYPE + FollowedBy(IDENTIFIER)) +
IDENTIFIER).parseString(text)

您也可以将其写为:

res = (Optional(AMF) +
SFMF +
(GENERIC_TYPE + IDENTIFIER | IDENTIFIER)).parseString(text)

Pyparsing 不会像正则表达式那样执行任何前瞻操作,您必须将其显式包含在语法定义中。

此外,由于 IDENTIFIER 将匹配任何字符串,因此您可能需要定义一个类似于“keyword”的表达式来匹配所有语言关键字,然后将 IDENTIFIER 定义为:

keyword = MatchFirst(map(Keyword,"public private protected static final".split()))
IDENTIFIER = ~keyword + Word(alphas + '_', alphanums + '_')

最后,您可能希望 GENERIC_TYPE 处理的不仅仅是简单的 container<type>定义,例如 Map<String,String> , Map<String,List<String>>甚至Map<String,Map<String,Map<String,Map<String,Map<String,String>>>>>

这将解析所有这些:

GENERIC_TYPE = Group(IDENTIFIER + nestedExpr('<', '>', content=delimitedList(IDENTIFIER)))

关于python - Pyparsing 左侧为Optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35988117/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com