Próbowałem teraz przez 1 godzinę, aby to rozgryźć na regex101 ... ale nie rozwiązałem tego. Oto mała lista, która przejdzie przez moje wyrażenie regularne:

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"

Teraz chcę uchwycić 5 grup. Próbowałem zastosować następujące wyrażenie regularne: \A(.+)\.(C\d{1,2})(B\d{1,2})?.?(42U|48U)?.+-(.+)

Grupa 1:

This.is.Test.Nr.One
Is.this.Nr.Two
This.Number.Random
This.is.Random.Number

Grupa 2:

C01
C03
C02
C08

Grupa 3:

B01
B03
**missing but should still work for all the other groups**
B01

Grupa 4:

42U
48U
42U
**missing but should still work for all the other groups**

Grupa 5:

Datacenter1
Datacenter4
Datacenter1
Datacenter2

EDYTUJ: zapomniałem, że może być też taki przypadek:

Is.this.Nr.Two.B03.London.48U.Rack.04-Datacenter4

1
YvesNr1 2 kwiecień 2020, 16:37

3 odpowiedzi

Najlepsza odpowiedź

Jednym ze sposobów jest opcjonalne dopasowanie do części C, B i U i użycie znajdujących się w nich grup przechwytywania

^(?:(.+?)\.(C\d{1,2}))?(?:.*?(B\d{1,2}))?\.(?:.*?(42U|48U))?.*-(.+)$

Demo Regex

2
The fourth bird 2 kwiecień 2020, 14:37

Ten ostatni był magiem umysłów, ale to właśnie działa.

^([a-zA-Z.]*\.)(C\d{1,2})?(B\d{1,2})?([.A-Za-z]*)(42U|48U)?.+-(.+)

Połączyć

0
Edwin Clement 2 kwiecień 2020, 14:03
(.+)\.(C\d{1,2})?(B\d{1,2})?(?:\.[A-Za-z]+)*\.(42U|48U)?.+-(.+)

Będzie działać.
Kod testowy wygląda następująco:

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')

Wynik:

('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')
0
Boseong Choi 2 kwiecień 2020, 14:05