Wpis z mikrobloga

Mirki programisty, jestem nowy w regexach i pythonie. Wejściowy ciąg wygląda np. tak:
$$CommandName1??CommandParam$$$$CommandName2??CommandParam$$$$CommandName3??CommandParam$$
Ogólna struktura: $$NazwaKomendy??Parametr$$
W jednym stringu mogą być takie struktury połączone jak w przykładzie.
Potrzebuję przy pomocy metody match() a następnie groups() wyciagnac liste komend i parametrów w takiej postaci:
[CommandName1??CommandParam , CommandName2??CommandParam , CommandName3??CommandParam]
Później już sobie umiem z tym poradzić.
Jakiś pomysł na regexa do metody match() ?
#pytanie #programowanie #python #regex
  • 15
@bred_one:

>>> re.split("\$+", "$$CommandName1??CommandParam$$$$CommandName2??CommandParam$$$$CommandName3??CommandParam$$")
['', 'CommandName1??CommandParam', 'CommandName2??CommandParam', 'CommandName3??CommandParam', '']

a puste elementy masz, bo ciąg zaczyna się i kończy na separatorze.

>>> re.split("\$+", "$$CommandName1??CommandParam$$$$CommandName2??CommandParam$$$$CommandName3??CommandParam$$".strip("$"))
['CommandName1??CommandParam', 'CommandName2??CommandParam', 'CommandName3??CommandParam']
Z tego, co mi wiadomo (bijcie jak kłamię) obsługa regexów z zasady powinna być wolniejsza ( ͡° ͜ʖ ͡°)

@SwordPL: I co z tego? Piszesz na procesor x86, nie mikrokontroler - tutaj wystarczy, że nie stosujesz algorytmów o nieoptymalnej złożoności dla problemu i nie czekasz na rzeczy, na które nie musisz czekać (np. na IO) - co rozwiązuje 99% problemów z wydajnością poza grami.

@Ginden: Zgadzam się, ale w przypadku, gdy możesz wykorzystać równie prosto rozwiązanie szybsze - jak split - to jest jakaś potrzeba marnowania zasobów?
Edit:
Ja nie mówię, że regexy są złe w ogóle; regexy są złe tutaj.
@Pipcieo: Nierekursywny regex ma złożoność obliczeniową O(2^m+n) (m = długość regexa, n = długość stringa), prawie taką samą jak .split (O(n)). Biorąc pod uwagę, że koszt O(2^m) jest ponoszony jednorazowo (dlatego często używane regexy w wielu językach należy traktować z re.compile()), to cóż...
@SwordPL: W tym przypadku to rzeczywiście prawda, split jest rozwiązaniem lepszym, bo czytelniejszym i szybszym, ale gość chciał się podszkolić z regexów.
@Pipcieo, @Ginden: Biorąc pod uwagę, że m jest ustalone, asymptotyczna złożoność dla splita i regexa jest taka sama - różni się to tylko stałą. Dodatkowo, regex załatwia za jednym przejazdem podział po $$ i po ??, czego split nie umie.
@frax: przede wszystkim regex jest tutaj nadmiarowy. Separator jest stały ($$), więc używamy .split(). To, że da się to zrobić regexem - OK. Da się też zrobić pętle for i jechać znak po znaku. Da się również najpierw zakodować ten napis rot13, zdekodować i dopiero parsować. Tylko po co.

Później masz coś zrobić z takim kodem i się zastanawiasz dlaczego ten chu^H^H^Hwspółpracownik użył tu regexpa. Może w specyfikacji jest napisane, że
@Pipcieo: Możliwe, chociaż ja jako separatora użyłbym zdecydowanie r"\${2,}", a nie tak jak u ciebie. Jeżeli separatorem jest $$, to pewnie po to, żeby pojedynczy $ mógł wystąpić ( @bred_one, zwróć na to uwagę).