Python正则表达式可匹配给定字符串中的多个模式

时间:2019-05-22 19:03:51

标签: python regex python-3.x

在下面的字符串中,我需要public interface InterfaceB extends Observer<B> {} public interface InterfaceC extends Observer<C> {} public class A implements InterfaceB, InterfaceC {} Version:Build Number:的值 目前,我正在分别获取上面列出的每个匹配项。 我想简化我的代码,以便单行匹配。

perforce_url:

我已使用re.match分别提取Version:内部版本号和perforce_url:的值。但是,我想简化并在一行中完成。

x = '''Version: 2.2.4125
Build Number: 125
Project Name: xyz.master
Git Url: git+ssh://git@stash.xyz.com:123/ab/dashboard
Git Branch: origin/master
Git Built Data: qw123ed45rfgt689090gjlllb
perforce_url:
  //projects/f5/dashboard/1.3/xyz/portal/
artifacts:
   "..//www/":     www/ '''

import re
matchObj=re.match('Version:\s*(.*)\n', x)
if matchObj:
  print  matchObj.group(1)

matchObj=re.match('perforce_url:\s*(.*)\n', x)
if matchObj:
  print  matchObj.group(1)

我尝试了以下模式:

版本:matchObj=re.match('Build Number:\s*(.*)\n', x) if matchObj: print matchObj.group(1)

但是它没有用。我想创建一个列表x并使用

将匹配项追加到列表中
\s*(.*)\n|perforce_url:\s*(.*)\n.

预期结果:

  

['2.2.4125','//projects/f5/dashboard/1.3/xyz/portal/','125']

实际结果

  

2.2.4125

     

// projects / f5 / dashboard / 1.3 / xyz / portal /

     

125

2 个答案:

答案 0 :(得分:2)

您可以将Version和Build Number互相放在后面,以将这些值保存在捕获组中。

对于preforce_url,您可以使用带有否定超前(?:\n(?!perforce).*)*的重复模式来匹配行,只要它们不以perforce_url开头。

如果是,则使用捕获组进行匹配:

Version:\s*(.*)\nBuild Number:\s*(.*)(?:\n(?!perforce).*)*\nperforce_url:\s*(.*)

Regex demo | Python demo

例如:

import re

regex = r"Version:\s*(.*)\nBuild Number:\s*(.*)(?:\n(?!perforce).*)*\nperforce_url:\s*(.*)"
x = ("Version: 2.2.4125\n"
            "Build Number: 125\n"
            "Project Name: xyz.master\n"
            "Git Url: git+ssh://git@stash.xyz.com:123/ab/dashboard\n"
            "Git Branch: origin/master\n"
            "Git Built Data: qw123ed45rfgt689090gjlllb\n"
            "perforce_url:\n"
            "  //projects/f5/dashboard/1.3/xyz/portal/\n"
            "artifacts:\n"
            "   \"..//www/\":     www/ ")

print(re.findall(regex, x))

结果

[('2.2.4125', '125', '//projects/f5/dashboard/1.3/xyz/portal/')]

答案 1 :(得分:1)

基于@第四只小鸟的答案,但略有扭曲。 通过使用非捕获组,您可以避免在“内部版本号”和“ perforce”之间使用非捕获组。这样,您只需要针对要明确定位的对象使用正则表达式。 >

r"Version:\s*(.*)\n|Build Number:\s*(.*)\n|perforce_url:\s*(.*)\n"

regex

编辑:不需要围绕“版本”,“构建”等实现的非捕获组