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/.

Członek DUG


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




złodziej wirków ]:->
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

Członek DUG


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




złodziej wirków ]:->
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




Moderator Mamut
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]}
ooOstatnio edytowany przez bercik (2008-05-26 18:09:25)
Offline

Członek DUG


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