|  |      1fgwmlhdkkkw      2024-08-15 12:03:41 +08:00 | 
|  |      2ipwx      2024-08-15 12:08:55 +08:00 写 dsl 可以用 pyparsing | 
|  |      3liberize      2024-08-15 12:36:28 +08:00 via Android 如果 get 后面的 name 里包含'|',直接用 split 有问题。 | 
|  |      4R4rvZ6agNVWr56V0      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'"]}] ``` 抛砖引玉。 | 
|      5nowheremanx OP | 
|  |      6R4rvZ6agNVWr56V0      2024-08-15 13:16:02 +08:00 @nowheremanx  额 这算哪门子工整。。。 | 
|      7rming      2024-08-15 13:25:01 +08:00 awk 可解,就是学习成本有点高 | 
|      8rming      2024-08-15 13:26:53 +08:00 | 
|  |      9june4      2024-08-15 13:49:49 +08:00 格式这么简单有序的东西,完全没必要手写分析器从一个个字符处理,split 加正则才是正道,除非你本意是想学点新东西 |