Regex发布可以存在但不总是存在的python捕获组
我花了1小时在regex101上想弄明白。。。但我没有解决它。下面是一个小名单,上面列出了我的正则表达式:Regex发布可以存在但不总是存在的python捕获组,python,regex,Python,Regex,我花了1小时在regex101上想弄明白。。。但我没有解决它。下面是一个小名单,上面列出了我的正则表达式: list = ["This.is.Test.Nr.One.C01B01.42U.Rack.08-Datacenter1", "Is.this.Nr.Two.C03B03.London.48U.Rack.04-Datacenter4", "This.Number.Random.C02.Frankfurt.42U.Rack.12-Datacenter1",
list = ["This.is.Test.Nr.One.C01B01.42U.Rack.08-Datacenter1",
"Is.this.Nr.Two.C03B03.London.48U.Rack.04-Datacenter4",
"This.Number.Random.C02.Frankfurt.42U.Rack.12-Datacenter1",
"This.is.Random.Number.C08B01.Zuerich.Rack.01-Datacenter2"
现在我想捕捉5组。我尝试了以下正则表达式:\A(+)\(C\d{1,2})(B\d{1,2})??(42U | 48U)?。+-(.+)
第一组:
This.is.Test.Nr.One
Is.this.Nr.Two
This.Number.Random
This.is.Random.Number
第2组:
C01
C03
C02
C08
第3组:
B01
B03
**missing but should still work for all the other groups**
B01
第4组:
42U
48U
42U
**missing but should still work for all the other groups**
第5组:
Datacenter1
Datacenter4
Datacenter1
Datacenter2
编辑:我不知道也有这样的情况:
是.this.Nr.Two.B03.London.48U.Rack.04-Datacenter4
一种方法是使与C、B和U部件的匹配成为可选的,并使用内部的捕获组
^(?:(.+?)\.(C\d{1,2}))?(?:.*?(B\d{1,2}))?\.(?:.*?(42U|48U))?.*-(.+)$
最后一个是mindbender,但这就是它的工作原理
^([a-zA-Z.]*\.)(C\d{1,2})?(B\d{1,2})?([.A-Za-z]*)(42U|48U)?.+-(.+)
会有用的。测试代码如下:
重新导入
列表=[
“这是一个测试编号C01B01.42U机架08-Datacenter1”,
“这是2号C03B03伦敦48U机架04-Datacenter4”,
“此.Number.Random.C02.Frankfurt.42U.Rack.12-Datacenter1”,
“这是.is.Random.Number.C08B01.Zuerich.Rack.01-Datacenter2”,
“Is.this.Nr.Two.B03.London.48U.Rack.04-Datacenter4”,
]
模式=重新编译(
r'(.+)\。#group1和尾随文字“
r'(C\d{1,2})'#group2(可选)
r'(B\d{1,2})?#组3(可选)
r'(?:\[A-Za-z]+)*\。#例如跳过多个“.London”和“.”
r'(42U | 48U).+-'#组4(可选)和-
r'(.+)'#组5
)
对于列表中的文本:
match_object=pattern.search(文本)
如果匹配对象:
打印(匹配对象.groups())
其他:
打印('不匹配')
输出:
('This.is.Test.Nr.One','C01','B01','42U','Datacenter1')
('Is.this.Nr.Two','C03','B03','48U','Datacenter4')
('This.Number.Random','C02',None','42U','Datacenter1')
('This.is.Random.Number','C08','B01',None','Datacenter2')
('Is.this.Nr.Two','B03','48U','Datacenter4','
Wow。。。我读这本书甚至有困难。但我想我会理解它的,旁边还有Regex101的解释。小问题。它与最后一个不匹配。。。至少group01与它不匹配…据我所知,这是补丁^(+.+)\(?:(C\d{1,2}))?(?:*(B\d{1,2}))?\(?:*(42U | 48U))?*-(.+)$
,但如果我错了,请纠正我。。。根本没有regex-pro…@YvesNr1啊,我发布的模式对于上次更新您的问题之前的值是有效的。你的建议确实会得到你的匹配。你可以使模式的性能更高一点。^([^.]+(?:\(?![BC]\d{2})[^.]+)*。(?:(C\d{2})(?:(?![BC]\d{2})[^.\n]+*?(?:(B\d{2})(?:\(?:\(?![BC d}.\d{2}.[^.\n]*))(?:)(?:)(?![BC d{d{2}.[^.+)*)(?![BC d}.]d}.[^.+)。)(?)(?![124u-);请看(42U-.]
(.+)\.(C\d{1,2})?(B\d{1,2})?(?:\.[A-Za-z]+)*\.(42U|48U)?.+-(.+)