如何构建适用于多个案例的正则表达式

时间:2016-03-30 00:10:31

标签: python regex python-2.x

我有以下代码与comments变量中的字符串匹配,如何构造匹配以下所示注释的字符串?我想检查QSPR测试结果:\ siggy。*和测试结果:。*

import re    
comments = "QSPR TEST RESULTS:\\siggy\QSPRLog\QCA\CST\2016\3\28\TestCaseLogs\N12345678-3_28_16_16_36_29_000_635947797916487681.html are the results"
#comments = "TEST RESULTS:BT ON\OFF LOOKS GOOD"

def matchcomments(comments, matchstring):
  matchobj = re.search(matchstring, str(comments))
  if matchobj:
    return True
  return False

def main ():
  try:
        string = r"QSPR TEST RESULTS:\\siggy\.*"
        match = matchcomments(comments, string)
        if match == True:
          tested_bit_flag = True
        else:
          #string = r"Included in BIT"  
          string = r"DONOT MATCH"                                    
          match = matchcomments(comments, string)
          if match == True:
            tested_bit_flag = True
          else:
            tested_bit_flag = False                                         
  except KeyError:
        tested_bit_flag = False 
        print "This gerrit does not have comments:"
  print tested_bit_flag



if __name__ == "__main__":
  main()

3 个答案:

答案 0 :(得分:1)

comments = "QSPR TEST RESULTS:\\siggy\QSPRLog\QCA\CST\2016\3\28\TestCaseLogs\N12345678-3_28_16_16_36_29_000_635947797916487681.html are the results"
string = r"(?:QSPR)?\s?TEST\sRESULTS:\\siggy\\(.*)|(?:DONOT MATCH)"
matchobj = re.search(string, comments)
if matchobj:
    print True
    print matchobj.group(1) #Gives you the text you are interested in eg. QSPRLog\QCA\CST\2016\3\28\TestCaseLogs\N12345678-3_28_16_16_36_29_000_635947797916487681.html are the results
else:
    print False

说明:

(?:QSPR)?(?:DONOT MATCH)

(?:)表示非捕获组。这个想法是检查组的存在与否(在这种情况下是QSPR或DONOT MATCH),而不关心匹配是什么(因为我们已经知道它是什么)。最后的问号表示该组是可选的。

<强> \ S TEST \ sRESULTS:\ siggy \

这部分只是与给出的文本匹配。

<强>(。*)

在群组中捕捉您感兴趣的文字。请注意,这是唯一的(捕获)组,因此当您使用参数1调用匹配对象的group属性时,您将获得您感兴趣的文本。

另请注意,此正则表达式将捕获0个或更多字符。替换为(。+)以捕获1个或多个字符,以确保不空虚。

| 字符表示左侧的表达式或右侧的表达式应匹配。在这种特殊情况下,由于右边的表达式中没有组(?:DONOT MATCH),当comments =“DONOT MATCH”时调用matchobj.group(1)将返回None。请务必稍后在代码中进行检查。

答案 1 :(得分:0)

string = r"(QSPR TEST RESULTS:\\siggy\.*)|(DONOT MATCH)"

使用它。

答案 2 :(得分:0)

如果我理解正确的话:

    chart: {
      plotBackgroundColor: null,
      plotBorderWidth: null,
      plotShadow: false,
      type: 'pie',
      events: {
        load: function() {
          this.series[0].data[0].select();
          this.redraw();
        }
      }
    }

这应与您感兴趣的文字相匹配。

Demo here