(.+)\.(C\d{1,2})?(B\d{1,2})?(?:\.[A-Za-z]+)*\.(42U|48U)?.+-(.+)
будет работать.
Код тестирования следующий:
import re
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",
"Is.this.Nr.Two.B03.London.48U.Rack.04-Datacenter4",
]
pattern = re.compile(
r'(.+)\.' # group1 and trailing literal "."
r'(C\d{1,2})?' # group2(optional)
r'(B\d{1,2})?' # group3(optional)
r'(?:\.[A-Za-z]+)*\.' # skipping for example multiple ".London" and "."
r'(42U|48U)?.+-' # group4(optional) and ... -
r'(.+)' # group5
)
for text in list_:
match_object = pattern.search(text)
if match_object:
print(match_object.groups())
else:
print('Not matched')
вывод:
('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', None, 'B03', '48U', 'Datacenter4')