首页 > 解决方案 > 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_idslog遵循以下格式expected_result

node_ids = ['123-321', '123-456'] 我能够得到输出时

["targets:['123-321', '123-456']"]

标签: pythonpython-3.xregex

解决方案


使用或运算符|

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']会被错误匹配。


推荐阅读