Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
pracuję nad prostym projektem mającym na celu połączenie zalet shella, sql i mpg123 :P generalnie próbuję stworzyć kawałek kodu, który potrafiłby przekształcić następującego stringa:
foo bar 'boom sux' aloha 'joe''s juice' jinx
w następującą tablicę:
["foo", "bar", "boom sux", "aloha", "joe's juice", "jinx"]
ewentualnie, jeśli znalazłby średnik pośrodku stringa, to aby jeszcze rozp... ową tablicę na dwie kolejne, np
foo lmao; bar
[["foo", "lmao"], ["bar"]]
próbowałem regexpami, próbowałem jakimś prostym liniowym algorytmem, ale mam chyba jakieś zaćmienie musku bo nic nie mogę wykombinować od paru godzin -,O
ktoś zna jakiś moduł pythona robiący podobne cuda, lub potrafiłby poradzić mi jakich wyrażeń i jak użyć by ugryźć tego dziada? da się to łatwo zrobić np. funkcją re.findall(pattern, string), czy trzeba zatrudniać jakieś diabelstwo w postaci lexa czy co?
Offline
pythonem się nie bawiłem ale w C/C++ można to rozwiązać mniej więcej w taki sposób:
robisz wskaźnik na tablicę stringów (char* argv[] - znane z main() w c++) zmienna pomocnicza typu string or something, i czytasz znak po znaku interesujący Cię string (linię poleceń) sprawdzając czy aktualny znak nie jest spacją. Jeżeli jest to kończysz "doklejanie" znaków do pomocniczego stringa, zapisujesz go do tablicy, zerujesz i kontynuujesz zabawę dopóki nie natrafisz na znak "\0" lub "\n" w interesującym Cię łańcuchu.
Offline
idzie tak zrobić, ale lepiej by było mieć do tego jakiś porządnie zkrafcony moduł lub eleganckie regexy... wiesz, dziś napiszę algorytm poprawnie parsujący takiego stringa, ale za chwilę będę chciał dodać wsparcie np. dla dereferowania zmiennych iiii.... dupa
Offline
no cóż, zawsze chwilowo możesz pozostać przy czymś takim i w chwili natchnienia zmodyfikować kod. Ja tak zawsze robię ;)) Jak coś mi nie wychodzi to robię prowizorkę (choć czasami sprawdza się prawo Murphy'iego że prowizorka jest trwalsza niż "główna budowla"), zostawiam to na dzień, dwa i w przypływie nowego natchnienia zabieram się za to jeszcze raz ;)
Offline
jezeli shella to (przykład dotyczy basha):
function make_tablica() { use_tab1=true; index=0; TABLICA1[$index]=$1; while shift; do if [ "$1" = ";" ]; then index=-1; use_tab1=false; elif $use_tab1; then let index++; TABLICA1[$index]=$1; else let index++; TABLICA2[$index]=$1; fi; done }
string musi wygladac odrobine inaczej (srednik musi byc zabezpieczony, napisy z ' lepiej obejmowac "):
make_tablica foo bar 'boom sux' aloha "joe's juice" jinx ";" ppp oo
wynik masz jako dwie tablice:
echo ${TABLICA1[3]} aloha echo ${TABLICA1[4]} joe's juice echo ${TABLICA2[1]} oo
Ostatnio edytowany przez bercik (2008-05-26 18:09:25)
Offline
Uch... zrobiłem.
co to jest za shit, nie wierzę że napisałem tak ohydny kod... ale cóż, działa XD
def sp(s): """OH MY GAWD THIS IS SUCH A HACK!!!!11111oneoneoneonesex PLEASE SOMEONE REWRITE THIS PILE OF CRAP........""" s += " " s = " ".join([a for a in __import__('re').split(" +", s)]) buf = "" quote = False for j in range(len(s)): try: if s[j] == "'" and s[j+1] == "'": s = s[:j]+s[(j+1):] elif s[j] == "'" and s[j+1] != "'": s = s[:j]+s[(j+1):] quote = not quote except IndexError: pass try: if s[j] != ' ': buf += s[j] else: if not quote: yield buf buf = "" else: buf += s[j] except: pass
na próbę:
print list(sp("foo''s bar 'boom sux' aloha 'joe''s juice' jinx 'lolz'"))
daje:
["foo's", 'bar', 'boom sux', 'aloha', "joe's juice", 'jinx', 'lolz']
Czyli teoretycznie jest poprawnie...
Musiałem użyć generatora bo poprzednia wersja z wykorzystaniem tablicy była jeszcze bardziej popaprana...
To jest koszmarne, błagam, wybaczcie mi ten syf :<
Offline