python - Python正则表达式忽略字符串中单词的顺序
问题描述
我想从日志中搜索子字符串,日志看起来像
log = "blablabla targets:['123-321', '123-456'] blablabla"
这是我的代码片段
node_ids = ['123-456', '123-321']
node_ids = re.escape(str(node_ids))
expected_result = f"targets:{node_ids}"
print(re.findall(expected_result, log))
输出
[]
虽然我有所有的 ID,node_ids
但由于 ID 的顺序与日志不匹配,代码没有返回任何内容。无论如何,我可以让正则表达式findall
忽略 ID 的顺序?
编辑
匹配条件:所有IDnode_ids
都log
遵循以下格式expected_result
当node_ids = ['123-321', '123-456']
我能够得到输出时
["targets:['123-321', '123-456']"]
解决方案
使用或运算符|
。
log = "blablabla targets:['123-321', '123-456'] blablabla"
node_ids = ['123-456', '123-321']
pattern=fr"(targets:\[(?:\s*'(?:{'|'.join(node_ids)})',?\s*){'{'+str(len(node_ids))+',}'}\])"
result=re.findall(pattern, log)
图案:
"(目标:\[(?:\s*'(?:123-456|123-321)',?\s*){2,}\])"
结果:
[“目标:['123-321', '123-456']”]
为确保node_ids
观察到所有 ID,ID 匹配的模式计数数等于或大于列表的长度。所以我们假设节点id不能重复,否则输入targets:['123-321','123-321']
会被错误匹配。