Python pyparsing以与输入文本相同的顺序将匹配的字符串和不匹配的stings分组
我在解析表达式字符串时遇到问题。我想使用pyparsing从输入字符串中识别所有标识符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
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'