此数组包含 code
和 collection
,其中 X
是可以是“任意数字”的掩码:
input_array = [{"code": "XXXX10", "collection": "one"}, {"code": "XXX610", "collection": "two"}, {"code": "XXXX20", "collection": "three"}]
我想要一个给出任何 6 位代码的函数,例如 000710
返回与最佳代码掩码匹配的值(例如为 one
)。这是我的尝试:
def get_collection_from_code(analysis_code):
for collection in input_array:
actual_code = collection["code"]
mask_to_re = actual_code.replace("X", "[\d\D]")
pattern = re.compile("^" + mask_to_re + "$")
if pattern.match(analysis_code):
print("Found collection '" + str(collection["collection"]) + "' for code: " + str(analysis_code))
return collection["collection"]
res = get_collection_from_code("010610")
print(res)
这里的问题是,如果我输入代码 010610
(并且我想返回 two
),它会返回 one
也匹配首先是模式 XXXX10
。
为了更好地理解,如果我输入值,我希望得到这些输出:
010610 > two
010010 > one
123420 > three
最佳答案
您可以迭代整个集合,保存任何匹配的“X”部分的长度,然后返回最短的:
input_array = [{"code": "XXXX10", "collection": "one"}, {"code": "XXX610", "collection": "two"}, {"code": "XXXX20", "collection": "three"}]
def get_collection_from_code(analysis_code):
results = {}
for collection in input:
actual_code = collection["code"]
mask_to_re = actual_code.replace("X", "[\d\D]")
pattern = re.compile("^" + mask_to_re + "$")
if pattern.match(analysis_code):
results[collection["collection"]] = actual_code.count('X')
if len(results):
best = sorted(results.items(), key=lambda i:i[1])[0]
print("Found collection '" + str(best[0]) + "' for code: " + str(analysis_code))
return best[0]
res = get_collection_from_code("010610")
# Found collection 'two' for code: 010610
注意,我已经保存了所有匹配项,以防您想以任何方式处理它们。否则,您可以只在每次迭代中检查“最佳”匹配并更新它。
关于python - 使用掩码和正则表达式从数组中获取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77514237/