繁体   English   中英

如何构建适用于多种情况的正则表达式

[英]how to construct a regex that works for multiple cases

我有以下代码与 comments 变量中的字符串匹配,我如何构造与下面显示的评论匹配的字符串?我想检查 QSPR TEST RESULTS:\\siggy.* 和 TEST RESULTS:.*

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()
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)? (?:不匹配)

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

\\s?TEST\\sRESULTS:\\siggy\\

这部分几乎与给定的文本相匹配。

(.*)

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

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

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

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

用这个。

如果我理解正确的话:

^(?:QSPR )?TEST RESULTS:.+$

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

演示在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM