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
@Pipcieo: Wiem, chciałem jednak machnąć to regexem i przy okazji się nimi oswoić ale trochę topornie mi to wchodzi -może temu że wybrałem średni przykład
@bred_one: To, że są regexy to nie znaczy, że koniecznie są dobrym rozwiązaniem. Z tego, co mi wiadomo (bijcie jak kłamię) obsługa regexów z zasady powinna być wolniejsza ( ͡°͜ʖ͡°)
@Pipcieo: @SwordPL: dla ciągu "$$GETANALOGVAL??1$$GETDIGITALVAL??1$$GETDIGITALVAL??2$$" split("$$") zwraca mi: ['', 'GETANALOGVAL??1', 'GETDIGITALVAL??1', 'GETDIGITALVAL??2', ''] Skąd 1 i ostatni element '' ???
>>> 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
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
@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,
@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ę).
$$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
r'\$\$[^?]+\?\?[^$]+\$\$'. Gdzieś w dokumentacji znajdziesz chyba, jak znaleźć wszystkie kolejne wystąpienia.split("$$") zwraca mi: ['', 'GETANALOGVAL??1', 'GETDIGITALVAL??1', 'GETDIGITALVAL??2', '']
Skąd 1 i ostatni element '' ???
>>> 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
@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.
Edit:
Ja nie mówię, że regexy są złe w ogóle; regexy są złe tutaj.
i oczywiście:
There should be one-- and preferably only one --obvious way to do it.O(2^m+n)(m= długość regexa,n= długość stringa), prawie taką samą jak.split(O(n)). Biorąc pod uwagę, że kosztO(2^m)jest ponoszony jednorazowo (dlatego często używane regexy w wielu językach należy traktować zre.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
mjest 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.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,
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ę).