python - 拆分后获取子串的值

标签 python regex python-3.x split

我有一个 json 文件,看起来像这样:

{
    "model": "Sequential",
    "layers": [
        {
            "L1": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.), input_shape=(224,224,3))",
            "L2": "MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same', data_format='channels_last')",
            "L3": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L4": "MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same', data_format='channels_last')",
            "L5": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L6": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L7": "Conv2D(filters = 64, kernel_size=(2,2), strides=(2,2), padding='same', data_format='channels_last', activation='relu', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L8": "MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same', data_format='channels_last')",
            "L9": "Flatten()",
            "L10": "Dense(4096, activation='softmax', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L11": "Dropout(0.4)",
            "L12": "Dense(2048, activation='softmax', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L13": "Dropout(0.4)",
            "L14": "Dense(1000, activation='softmax', use_bias=True, kernel_initializer='zeros', bias_initializer='zeros', kernel_regularizer=regularizers.l1(0.), bias_regularizer=regularizers.l1(0.), activity_regularizer=regularizers.l1(0.), kernel_constraint=max_norm(2.), bias_constraint=max_norm(2.))",
            "L15": "Dropout(0.4)"
        }
    ]
}

我想获取有关 json 文件中存在的层的信息。例如,Conv2D、MaxPooling2D、Flatten() 等。

此外,我想知道过滤器、kernel_size、stride、activation 等字符串的值。

我尝试通过这样做来获取图层名称:

with open('model.json','r') as fb:
    con = json.load(fb)
con['layers'][0]['L1'].split('(', 1)[0].rstrip()

输出是 'Conv2d'。同样,我得到了其他图层名称。

我需要帮助的是获取过滤器的值(例如 L1 中的 64)。

我试过这样做:

c = con['layers'][0]['L1'].split('(', 1)[1].rstrip()
c.split(',')
['filters = 8', ' kernel_size=(3', '3)', ' strides=(1', ' 1)', " padding='valid'", " data_format='channels_last'", " activation='relu'", ' use_bias=True', " kernel_initializer='zeros'", " bias_initializer='zeros'", ' kernel_regularizer=regularizers.l1(0.)', ' bias_regularizer=regularizers.l1(0.)', ' activity_regularizer=regularizers.l2(0.)', ' kernel_constraint=max_norm(2.)', ' bias_constraint=max_norm(2.)', ' input_shape=(28', '28', '1))']

但我仍然没有得到值(value)。

有谁知道如何获取这些信息吗?

最佳答案

使用正则表达式 - documentation进一步引用

import re

string_lst = ['filters','kernel_size','stride','activation']
my_dict = {}
for key,value in con['layers'][0].items():
    my_dict[key] = {}
    layer_names = value.split('(')[0].rstrip()
    my_dict[key][layer_names] = {}
    for i in string_lst:
        match = re.search(i+'(.+?), ', value)
        if match:
            filters = match.group(1).split("=")[1].strip()
            my_dict[key][layer_names][i] = filters

    if len(my_dict[key][layer_names]) <= 0:
        del my_dict[key]

print(my_dict)

O/P:

{
    'L1': {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, '
    L2': {'MaxPooling2D': {'stride': '(2,2)'}}, 'L3': {'Conv2D': 
    {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L4': {'MaxPooling2D': {'stride': '(2,2)'}}, 'L5': 
    {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L6': {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L7': {'Conv2D': {'filters': '64', 'kernel_size': '(2,2)', 'stride': '(2,2)', 'activation': "'relu'"}}, 
    'L8': {'MaxPooling2D': {'stride': '(2,2)'}}, 'L10': {'Dense': {'activation': "'softmax'"}}, 
    'L12': {'Dense': {'activation': "'softmax'"}}, 'L14': {'Dense': {'activation': "'softmax'"}}
}

JSON 包含重复的图层名称,如果您想要唯一记录则替换所有行

my_dict[key][layer_names]

my_dict[layer_names]

并删除此 my_dict[key] = {}

关于python - 拆分后获取子串的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56800981/

相关文章:

javascript - 简单的正则表达式/:[a-z]+/not working as expected in javascript

javascript - 如何将 Websockets 与 Pyramid 和 socket.io 一起使用?

python - pew 和 virtualenvwrapper 可以一起使用吗

python - 如何键入提示返回当前类实例的函数?

python - 使用 SQLAlchemy 获取表中的行数

javascript - 使用多种模式构建跨度标签的正则表达式

PHP - 解析、正则表达式 CSS 文件?

python - 在 Python 中将输入函数参数放入字典的最佳方法是什么?

python - 如何从 Google Colab 下载多个文件或整个文件夹?

python - 访问第 N 行 csv 文件的最佳方法