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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-05-26 15:41:49

  harry666t - Członek DUG

harry666t
Członek DUG
Zarejestrowany: 2007-01-28

parsowanie linii komend

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?


[ /\/\/\ o_0 ----->>>       Ascii Art Userbar User ]

"steal and steal and steal some more and give it to all your friends and keep on stealin'"
- Reznor

Offline

 

#2  2008-05-26 16:19:35

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: parsowanie linii komend

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.


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#3  2008-05-26 16:40:32

  harry666t - Członek DUG

harry666t
Członek DUG
Zarejestrowany: 2007-01-28

Re: parsowanie linii komend

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


[ /\/\/\ o_0 ----->>>       Ascii Art Userbar User ]

"steal and steal and steal some more and give it to all your friends and keep on stealin'"
- Reznor

Offline

 

#4  2008-05-26 16:55:00

  winnetou - złodziej wirków ]:->

winnetou
złodziej wirków ]:->
Skąd: Jasło/Rzeszów kiedyś Gdańs
Zarejestrowany: 2008-03-31
Serwis

Re: parsowanie linii komend

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 ;)


LRU: #472938
napisz do mnie: ola@mojmail.eu
Hołmpejdż | Galerie | "Twórczość" || Free Image Hosting

Offline

 

#5  2008-05-26 18:07:34

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: parsowanie linii komend

jezeli shella to (przykład dotyczy basha):

Kod:

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 "):

Kod:

make_tablica foo bar 'boom sux' aloha "joe's juice" jinx ";" ppp oo

wynik masz jako dwie tablice:

Kod:

echo ${TABLICA1[3]}
aloha
echo ${TABLICA1[4]}
joe's juice
echo ${TABLICA2[1]}
oo

Ostatnio edytowany przez bercik (2008-05-26 18:09:25)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#6  2008-05-27 15:34:59

  harry666t - Członek DUG

harry666t
Członek DUG
Zarejestrowany: 2007-01-28

Re: parsowanie linii komend

Uch... zrobiłem.

co to jest za shit, nie wierzę że napisałem tak ohydny kod... ale cóż, działa XD

Kod:

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ę:

Kod:

print list(sp("foo''s bar 'boom sux' aloha   'joe''s juice' jinx 'lolz'"))

daje:

Kod:

["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 :<


[ /\/\/\ o_0 ----->>>       Ascii Art Userbar User ]

"steal and steal and steal some more and give it to all your friends and keep on stealin'"
- Reznor

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)