pyparsing 以与输入文本相同的顺序对匹配的字符串和不匹配的字符串进行分组

pyparsing to group matched string and unmatched stings in the same order the input text

我在解析表达式字符串时遇到问题。我想使用 pyparsing 从输入字符串中识别所有标识符。

identifier=pyparsing_common.identifier

我的输入字符串是

identifier.parseString('1+2*xyz*abc/5')

我想要下面的输出

[['1+2*'],['xyz'],['*'],['abc'],['/5']]

谁能帮我实现这个目标?

提前致谢

我找到了一个答案,我怀疑它可能无效,但它按预期工作。

   from pyparsing import pyparsing_common
   identifier=pyparsing_common.identifier
   input_string='1+2*xyz*abc/5'
   b=0
   split_array=[]
   for match, start, stop in identifier.scanString(input_string):
       split_array.append(input_string[b:start])
       split_array.append(input_string[start:stop])
       b=stop
       print(match, start, stop)
   split_array.append(input_string[b:])
   print(split_array)

输出为

['xyz'] 4 7
['abc'] 8 11
['1+2*', 'xyz', '*', 'abc', '/5']

如果你有,我仍然会请求某人验证并提供更好的解决方案。

谢谢。

这里有许多不同的代码示例,展示了一些解决问题的替代方法(使用 pyparsing 版本 2.4.7)。

使用您对 input_stringidentifier 的定义:

>>> input_string = "1+2*xyz*abc/5"
>>> identifier = pp.pyparsing_common.identifier

使用identifier.split()(类似于re.split)获取输入字符串的部分:

>>> print(list(identifier.split(input_string, includeSeparators=True)))
['1+2*', 'xyz', '*', 'abc', '/5']

使用 identifier.searchString() 到 return 每个匹配项的 ParseResults:

>>> print(identifier.searchString(input_string))
[['xyz'], ['abc']]

使用 sum() 内置将匹配组合成一个 ParseResults:

>>> print(sum(identifier.searchString(input_string)))
['xyz', 'abc']

使用locatedExpr辅助方法包装identifier,这样每个 match 产生一个包含匹配值的组,加上开始和 结束地点:

>>> print(sum(pp.locatedExpr(identifier).searchString(input_string)))
[[4, 'xyz', 7], [8, 'abc', 11]]

使用 dump() 将值显示为列表,并在每个列表中命名结果 小组:

>>> print(sum(pp.locatedExpr(identifier).searchString(input_string)).dump())
[[4, 'xyz', 7], [8, 'abc', 11]]
[0]:
  [4, 'xyz', 7]
  - locn_end: 7
  - locn_start: 4
  - value: 'xyz'
[1]:
  [8, 'abc', 11]
  - locn_end: 11
  - locn_start: 8
  - value: 'abc'