考虑下面的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)。
我正在寻找一些相同的帮助,感谢任何帮助。
答案 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)