Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex发布可以存在但不总是存在的python捕获组_Python_Regex - Fatal编程技术网

Regex发布可以存在但不总是存在的python捕获组

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",

我花了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",
        "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-);请看((.+)\.(C\d{1,2})?(B\d{1,2})?(?:\.[A-Za-z]+)*\.(42U|48U)?.+-(.+)