合并两个不同的Python RexEx搜索

时间:2019-02-21 03:43:41

标签: python

Python正则表达式问题...

  1. 需要将这两个正则表达式搜索组合为一个(它应该起作用 基于我的两个不同的输入mystring)
  2. 不确定为什么第一次搜索总是考虑第二组 括号(请参阅oracle警报)
  3. 但是我的第二次搜索正确地从 第一组括号(请参阅Mongo)

在此处感谢任何帮助...

import re
mystring="<https://myurl:6001/alerts|ebe182d2> [Open] Oracle Memory Alert - [Alerting] Oracle Memory Alert"
a=re.compile('<.*\|(.*)>.*\[(.*)\].*([O|o]racle).*(Memory Alert)')

matches=a.search(mystring)
if matches:
 print("matching")
 print("ID=",matches.group(1),"Status=",matches.group(2),"alert=",matches.group(3))
else:
 print("no match")

mystring="<https://myurl:6001/alerts|xvf381h1> [Open] Mongo Disk Alert - [Causing] Disk is full"
a=re.compile('<.*\|(.*)>.*\[(.*)\].*([M|m]ongo).*(Disk Alert)')
matches=a.search(mystring)
if matches:
 print("matching")
 print("ID=",matches.group(1),"Status=",matches.group(2),"alert=",matches.group(3))
else:
 print("no match")

输出:

matching
ID= ebe182d2 Status= Alerting alert= Oracle
matching
ID= xvf381h1 Status= Open alert= Mongo

1 个答案:

答案 0 :(得分:1)

这是您的代码的一个版本,它通过使匹配不那么贪婪来解决#2问题。最好同时更改这两种模式,因为即使您通过以下两种方法都能获得正确的结果,也可以使第二种模式更正确:

import re

mystring = "<https://myurl:6001/alerts|ebe182d2> [Open] Oracle Memory Alert - [Alerting] Oracle Memory Alert"
a = re.compile('<.*\|(.*)>.*?\[(.*?)\].*?([O|o]racle).*?(Memory Alert)')

matches = a.search(mystring)
if matches:
    print("matching")
    print("ID=", matches.group(1), "Status=", matches.group(2), "alert=", matches.group(3))
else:
    print("no match")

mystring = "<https://myurl:6001/alerts|xvf381h1> [Open] Mongo Disk Alert - [Causing] Disk is full"
a = re.compile('<.*\|(.*)>.*?\[(.*?)\].*?([M|m]ongo).*?(Disk Alert)')
matches = a.search(mystring)
if matches:
    print("matching")
    print("ID=", matches.group(1), "Status=", matches.group(2), "alert=", matches.group(3))
else:
    print("no match")

输出:

matching
('ID=', 'ebe182d2', 'Status=', 'Open', 'alert=', 'Oracle')
matching
('ID=', 'xvf381h1', 'Status=', 'Open', 'alert=', 'Mongo')

为了让我对问题的理解(在我的评论中)……如果您关心速度,则只想搜索这两种情况,并且您相信子字符串“ Oracle “内存警报”和“ Mongo磁盘警报”将很少出现,那么最好只寻找那些不带正则表达式的字符串。如果找到它们,则应用正则表达式测试以查看候选匹配项是否确实匹配。根据您对数据集的了解,有很多方法可以高度优化您的测试。例如,您不需要在字符串的开头开始寻找这两种模式。大概您可以想出一个地方,开始寻找您习惯的字符串,这些字符串总是会在这些模式出现之前就出现。

如果要匹配的内容很少出现,那么在性能方面,您所关心的就是知道大多数情况下(不一定是所有情况)不匹配字符串的速度。您想考虑如何快速排除大部分字符串。一旦您未能排除该字符串,那么如果您只在蓝月亮中走了那么远,那么确定该字符串是否真正匹配的时间并不重要。

如果您不关心速度,而只关心可读性,那么最好的办法就是使用您现在拥有的几乎每个东西分别测试每个案例。您要做的大多数优化都会使代码的可读性降低。

可能有数十种(即使不是数百种)针对此问题的潜在“正确”解决方案。这完全取决于您的数据集的最佳特性。遇到这样的问题的人通常不会遇到一个或几个正确的答案。

给我更多信息,我可以帮助您根据您的要求进行优化。

哦...这是对#1的某种回答。我做出额外的假设,即a)您不会看到小写的Mongo或Oracle,并且b)单词之间的空格始终是单个字符。如果您可以做出这两个假设,那么此表达式要比原始两个表达式快得多。您必须调整逻辑以仅取两个主要比赛的第一个单词。再说一次,如果您几乎看不到这些字符串,则花费的时间是无关紧要的。

a = re.compile('<.*\|(.*)>.*?\[(.*?)\].*?(Oracle Memory Alert|Mongo Disk Alert)')