分词驱动的parser vs. meta character驱动

本文探讨了JSON解析的基本原理,包括如何通过元字符驱动的方式处理JSON数据,重点介绍了如何使用Python实现JSON解析器,涵盖分词、状态转换及特殊字符处理等内容。
部署运行你感兴趣的模型镜像

字符分为

alphabet character

meta character

主框架就是分词,分出一个词做什么处理的问题,这个是根据当前的状态。而meta character主要就是决定状态。比如json parser,当分出一个词后,如果当前处在一个list的scope里,(之前出现过"[",还未出现"]"),那就parent.append(word),如果当前处在一个dict里,且在key的部分,则记录key = word,如果在value的部分,则parent[key] = word

[, ], {, }, : 等meta character主要就是负责更新scope、状态。引号的意思是强制分词,即不用自己分词,而是强制两个引号之间的字符串,有特殊字符也好,有空白也好都不管,作为一个word。


而meta character驱动的事件是出现了一个什么语法字符(:,{}等)然后做什么处理的问题,其实差不多,meta character驱动更全面一些,和分词也不矛盾,分词是给出当前数据,语法字符判断、更新状态。另一个版本的json parser, 分词驱动的思想:

def parseJson(json):
    stack, meta, wordStart, inQuote, key = [[]], '[]{},: \t"', -1, False, [None]
    def handle(item):
        if isinstance(item, str):
            if item.isdigit(): item = int(item) #convert to int if item is literal value and all numbers
            elif item[0] == '"': item = item[1: -1]
        if isinstance(stack[-1], list): stack[-1].append(item) #container is list
        elif key[0] is None: key[0] = item
        else:
            stack[-1][key[0]] = item
            key[0] = None
        if isinstance(item, list) or isinstance(item, dict): stack.append(item)
    for i in xrange(len(json)):
        if inQuote:
            if json[i] == '"':
                handle(json[wordStart: i + 1])
                inQuote = False
        elif json[i] not in meta:
            if i == 0 or json[i - 1] in meta: wordStart = i
            if i == len(json) - 1 or json[i + 1] in meta: handle(json[wordStart: i + 1])
        elif json[i] == '"':
            inQuote = True
            wordStart = i
        elif json[i] in '{[': handle([] if json[i] == '[' else {})
        elif json[i] in ']}':
            stack.pop()
    return stack[-1][0] if len(stack[-1]) > 0 else None



您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

在使用 `argparse` 模块时,`parser.add_argument()` 方法中并没有直接的 `meta` 变量,但可能存在与 `metavar` 参数相关的功能,它常用于帮助文档中显示更清晰的参数说明。 ### `metavar` 的作用和用法 `metavar` 是 `parser.add_argument()` 方法中的一个可选参数,用于指定在帮助信息(`--help`)中显示的参数名称。默认情况下,`argparse` 会根据参数的名称(如 `--name` 或 `dest`)自动生成帮助信息中的变量名,但通过 `metavar`,可以自定义该显示名称。 例如,如果有一个参数 `--weights`,其类型为字符串,可以使用 `metavar='WEIGHTS_PATH'` 来在帮助信息中显示更具描述性的变量名,而不是默认的 `'str'` 或参数名。这种做法有助于提升命令行接口的可读性和用户友好性 [^3]。 #### 示例代码: ```python import argparse parser = argparse.ArgumentParser(description='Example for argparse with metavar') parser.add_argument('--weights', type=str, metavar='WEIGHTS_PATH', default='best.pt', help='Path to the weights file') parser.add_argument('--epochs', type=int, metavar='EPOCHS_COUNT', default=100, help='Number of training epochs') args = parser.parse_args() print(args.weights) print(args.epochs) ``` #### 输出帮助信息(`--help`)示例: ```bash usage: example.py [--help] [--weights WEIGHTS_PATH] [--epochs EPOCHS_COUNT] optional arguments: --help show this help message and exit --weights WEIGHTS_PATH Path to the weights file (default: best.pt) --epochs EPOCHS_COUNT Number of training epochs (default: 100) ``` ### `metavar` 的典型应用场景 1. **多参数显示**:当使用 `nargs` 指定参数接受多个值时,`metavar` 可以用于分别命名每个参数值,从而提高帮助信息的可读性。 ```python parser.add_argument('--coordinates', nargs=2, metavar=('X', 'Y'), help='Coordinates for the point') ``` 在帮助信息中会显示为: ``` --coordinates X Y Coordinates for the point ``` 2. **简化复杂参数类型**:对于复杂的数据类型或特殊用途的参数,可以通过 `metavar` 提供更直观的提示,而不是直接显示类型信息。 3. **保持帮助信息整洁**:当参数名较长或者需要对用户隐藏实现细节时,使用 `metavar` 可以让帮助信息更简洁明了。 需要注意的是,`metavar` 仅影响帮助信息的显示内容,不会对参数的实际解析或处理逻辑产生影响 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值