在下面的字符串中,我需要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
答案 0 :(得分:2)
您可以将Version和Build Number互相放在后面,以将这些值保存在捕获组中。
对于preforce_url,您可以使用带有否定超前(?:\n(?!perforce).*)*
的重复模式来匹配行,只要它们不以perforce_url开头。
如果是,则使用捕获组进行匹配:
Version:\s*(.*)\nBuild Number:\s*(.*)(?:\n(?!perforce).*)*\nperforce_url:\s*(.*)
例如:
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"
编辑:不需要围绕“版本”,“构建”等实现的非捕获组