Ciąg znaków w Pythonie zastępuje znak wyrażeniem regularnym [duplikat]

Nov 27 2020

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

1 TimBiegeleisen Nov 27 2020 at 06:17

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ć sequencetekst 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