【问题标题】:Python regex ignore order of words in stringPython正则表达式忽略字符串中单词的顺序
【发布时间】:2023-03-04 01:53:01
【问题描述】:

我想从日志中搜索一个子字符串,日志看起来像

log = "blablabla targets:['123-321', '123-456'] blablabla"

这是我的代码 sn-p

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))

输出

[]

虽然我有node_ids 中的所有ID,但由于ID 的顺序与日志不匹配,代码没有返回任何内容。无论如何,我可以让正则表达式 findall 忽略 ID 的顺序?

编辑 匹配条件:node_ids中的所有ID都在log中观察,格式为expected_result

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

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

【问题讨论】:

  • 你也要搜索​​括号吗?
  • 匹配的条件是什么?一个匹配是否应该以任一顺序同时具有两个节点 ID,还是一个匹配可以具有任一节点 ID?
  • 我的问题不够清楚,添加了匹配条件

标签: python python-3.x regex


【解决方案1】:

使用或运算符|

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

【讨论】:

    【解决方案2】:

    如果顺序无关紧要,则可以为 node_ids 使用一个集合,并将节点 id 匹配的集合与原始集合进行比较。

    import re
    
    log = "blablabla targets:['123-321', '123-456'] blablabla"
    node_ids = {'123-456', '123-321'}
    # find all node ids in the log entry
    ids = re.findall(r'\b\d{3}-\d{3}\b', log)
    if node_ids == set(ids):
          print("found match:", ids)
    

    输出:

    found match ['123-321', '123-456']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2018-05-14
      • 2011-02-25
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多