Python pyparsing以与输入文本相同的顺序将匹配的字符串和不匹配的stings分组

Python pyparsing以与输入文本相同的顺序将匹配的字符串和不匹配的stings分组,python,match,pyparsing,Python,Match,Pyparsing,我在解析表达式字符串时遇到问题。我想使用pyparsing从输入字符串中识别所有标识符 identifier=pyparsing\u common.identifier 我的输入字符串是 identifier.parseString('1+2*xyz*abc/5') 我想要下面的作为输出 [['1+2*'],['xyz'],['*'],['abc'],['/5']] 谁能帮我实现这个目标 提前感谢我已经找到了一个答案,我怀疑它可能无效,但它按预期工作 from pyparsing im

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

identifier=pyparsing\u 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']
如果您有,我仍然会请求他人验证并提供更好的解决方案。


谢谢。

我找到了一个答案,我怀疑它可能无效,但它的效果与预期相符

   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)

使用
输入\u字符串
标识符
的定义:

>>> 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()
为每个匹配返回ParseResults:

>>> print(identifier.searchString(input_string))
[['xyz'], ['abc']]
使用内置的
sum()

>>> print(sum(identifier.searchString(input_string)))
['xyz', 'abc']
使用
locatedExpr
helper方法包装
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'

下面是一些不同的代码示例,以展示解决问题的一些替代方法(使用pyparsing版本2.4.7)

使用
输入\u字符串
标识符
的定义:

>>> 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()
为每个匹配返回ParseResults:

>>> print(identifier.searchString(input_string))
[['xyz'], ['abc']]
使用内置的
sum()

>>> print(sum(identifier.searchString(input_string)))
['xyz', 'abc']
使用
locatedExpr
helper方法包装
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'