通过使用正则表达式

时间:2017-05-18 12:51:15

标签: python json regex dictionary

考虑下面的json对象,在这里我需要通过使用正则表达式匹配值来获取父键。

{
    "PRODUCT": {
        "attribs": {
            "U1": {
                "name": "^U.*1$"
            },
            "U2": {
                "name": "^U.*2$"
            },
            "U3": {
                "name": "^U.*3$"
            },
            "U4": {
                "name": "^U.*4$"
            },
            "U5": {
                "name": "^U.*5$"
            },
            "P1": {
                "name": "^P.*1$"
            }   
        }
    }
}

我将传递一个像这样的“U10001”字符串,它应该通过匹配正则表达式(^ U. * 1 $)返回键(U1)。

如果我传递的字符串如此“P200001”,它应该通过匹配正则表达式(^ P. * 1 $)返回键(P1)。

我正在寻找一些相同的帮助,感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

我不确定你是如何获得你的JSON的,但你添加了python作为标记,所以我假设在某个点你将把它作为一个字符串存储在你的代码中。

首先将字符串解码为python dict。

import json
my_dict = json.loads(my_json)["PRODUCT"]["attribs"]

如果JSON的格式如上所示,你应该得到一个带有U1,U2等键的字典。

现在您可以在python中使用filter来应用正则表达式逻辑,并使用re来进行实际匹配。

import re
test_string = "U10001"
def re_filter(item):
   return re.match(item[1]["name"], test_string)

result = filter(re_filter, my_dict.items())

# Just get the matching attribute names
print [i[0] for i in result]

我没有运行代码所以它可能需要一些语法修复,但这应该给你一般的想法。当然,您需要使其更通用以允许多个产品。

答案 1 :(得分:0)

这个怎么样:

import re
my_dict = {...}


def get_key(dict_, test):
    return next(k for k, v in dict_.items() if re.match(v['name'], test))

test = "U10001"
result = get_key(my_dict['PRODUCT']['attribs'], test))
print(result)  # U1

答案 2 :(得分:0)

您能详细说明您想要设计的内容吗?这是一种快速返回所需密钥的方法。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <ImageView
        android:layout_width="@integer/width"
        android:layout_height="@integer/height"
        android:adjustViewBounds="true"
        android:id="@+id/imageView"
        android:layout_margin="5dp"
        android:layout_centerVertical="true"
        android:layout_alignParentEnd="true" />

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/imageView" />


</RelativeLayout>

如果你想遍历整个json,然后将它加载到字典中,然后遍历“PRODUCT” - &gt;“attribs”字典以获得所需的密钥 -

import re
def getKey(string):
    return re.search('^(.\d)\d+', string).group(1)