Ciąg znaków w Pythonie zastępuje znak wyrażeniem regularnym [duplikat]
Wystąpił problem z wyrażeniem regularnym, którego nie rozumiem. Próbuję zastąpić przecinek między ciągami średnikiem i to nie działa. Oto przykładowy ciąg poniżej. Skonfigurowałem wyrażenie regularne, aby zastąpić wszystko oprócz treści po „sekwencji” w grupie nieprzechwytywanej wyrażenia regularnego, więc przecinek na końcu powinien zostać zastąpiony jedynym podciągiem w grupie nieprzechwytywanej, średnikiem. Ale to nie działa. Wydaje się, że zachowuje dowolny ciąg znaków tylko wtedy, gdy umieszczam (?: Sequence :) jako grupy bez przechwytywania. Jak tylko dodam \ d, zastępuje całość. Nie wiem dlaczego.
W moim prawdziwym problemie mam poważne tagi treści oznaczone dwukropkiem i zakończone średnikiem. W sekwencji tagów zamiast średnika znajduje się pomyłkowy przecinek, który muszę zastąpić, ale pozostawiam wszystko niezmienione. Zatem rozwiązanie powinno po prostu zmienić sekwencję: 2, na sekwencję: 2;
a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)
new_string
Szukałem innych rozwiązań, które powinny działać, ale nie w tym. Każda pomoc jest mile widziana i proszę o informację, czy mogę wyjaśnić to pytanie.
Odpowiedzi
Prawdopodobnie zamierzałeś tutaj użyć pozytywnego negatywnego spojrzenia wstecz:
a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)
print(new_string)
To drukuje:
tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4
Nawiasem mówiąc, jeśli chcesz bezpośrednio dopasować sequence
tekst przed przecinkiem docelowym, to jest w porządku, ale zastąp go również za pomocą grupy przechwytywania:
a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
print(new_string) # same as above