![]() |
1
fgwmlhdkkkw 2024-08-15 12:03:41 +08:00
|
![]() |
2
ipwx 2024-08-15 12:08:55 +08:00
写 dsl 可以用 pyparsing
|
![]() |
3
liberize 2024-08-15 12:36:28 +08:00 via Android
如果 get 后面的 name 里包含'|',直接用 split 有问题。
|
![]() |
4
R4rvZ6agNVWr56V0 2024-08-15 13:01:42 +08:00
```
from pyparsing import Word, alphanums, Suppress, Group, OneOrMore, Optional def parse_pipeline(pipeline_string): # 定义基本元素 command = Word(alphanums + "_") argument = Word(alphanums + "_='") pipe = Suppress("|") # 定义命令结构 command_structure = Group(command + Optional(Group(OneOrMore(argument)))) # 定义整个管道结构 pipeline = OneOrMore(command_structure + Optional(pipe)) # 解析字符串 parsed = pipeline.parseString(pipeline_string) result = [] for item in parsed: if len(item) == 1: result.append({"command": item[0], "args": []}) else: result.append({"command": item[0], "args": item[1].asList()}) return result # 使用 pipeline_str = "parser | get='name' | len==10 | original | parser | get='age'" parsed_pipeline = parse_pipeline(pipeline_str) print(parsed_pipeline) ``` Output: ``` [{'command': 'parser', 'args': []}, {'command': 'get', 'args': ["='name'"]}, {'command': 'len', 'args': ['==10']}, {'command': 'original', 'args': []}, {'command': 'parser', 'args': []}, {'command': 'get', 'args': ["='age'"]}] ``` 抛砖引玉。 |
5
nowheremanx OP |
![]() |
6
R4rvZ6agNVWr56V0 2024-08-15 13:16:02 +08:00
@nowheremanx 额 这算哪门子工整。。。
|
7
rming 2024-08-15 13:25:01 +08:00
awk 可解,就是学习成本有点高
|
8
rming 2024-08-15 13:26:53 +08:00
|
![]() |
9
june4 2024-08-15 13:49:49 +08:00
格式这么简单有序的东西,完全没必要手写分析器从一个个字符处理,split 加正则才是正道,除非你本意是想学点新东西
|