Code: Alles auswählen
replace "Hello" "he|he hehe" | replace '$NAME$' user.username | addslashes
Code: Alles auswählen
[['replace', '"Hello"', '"he|he hehe"'], ['replace', "'$NAME$', 'user.username'], ['addslashes']]
Code: Alles auswählen
replace "Hello" "he|he hehe" | replace '$NAME$' user.username | addslashes
Code: Alles auswählen
[['replace', '"Hello"', '"he|he hehe"'], ['replace', "'$NAME$', 'user.username'], ['addslashes']]
Code: Alles auswählen
s = "replace \"Hello\" \"he|he hehe\" | replace '$NAME$' user.username | addslashes".split()
print s
res=[]
tmp=[]
for e in s:
if e == '|':
res.append(tmp)
tmp=[]
else:
tmp.append(e)
print res
Damit verliere ich aber die Leerzeichen in den Strings.ProgChild hat geschrieben:Jetzt solltest du das split noch durch eine RegEx ersetzten, das die Anführungszeichenberücksichtig...Code: Alles auswählen
...
Das solltest du mit der RegEx berücksichtigen...blackbird hat geschrieben:Damit verliere ich aber die Leerzeichen in den Strings.
Code: Alles auswählen
import re
s = "replace \"Hello\" \"he|he hehe\" | replace '$NAME$' user.username | addslashes"
items = re.compile('".*"|\w+|\|').findall(s)
res=[]
tmp=[]
for e in items:
if e == '|':
res.append(tmp)
tmp=[]
else:
tmp.append(e)
print res
War noch ein kleiner Fehler drinn, aber sonst klappts. Wenn du mir nicht schreibst, wass nich funktionier, dann kann ich dir nicht helfen. In dem Programm von mir müssen außerdem auch keine Whitespaces vor, oder nach dem | Sybol sein.blackbird hat geschrieben:Funktinoiert leider nicht. zwischen den Pipe Symbolen müssen übrigens keine leerzeichen vorkommen, was die Sache nicht gerade einfacher macht.
Code: Alles auswählen
import re
s = "replace "Hello" "he|he hehe" | replace '$NAME$' user.username | addslashes"
items = re.compile('".*?"|[\w|$|\.]+|\|').findall(s)
res=[]
tmp=[]
for e in items:
if e == '|':
res.append(tmp)
tmp=[]
else:
tmp.append(e)
res.append(tmp)
print res
Code: Alles auswählen
> python whitespace_parse.py
[['replace', '"Hello"', '"he|he hehe"'], ['replace', '$NAME$', 'user.username'], ['addslashes']]
Ausgabe:ProgChild hat geschrieben:War noch ein kleiner Fehler drinn, aber sonst klappts. Wenn du mir nicht schreibst, wass nich funktionier, dann kann ich dir nicht helfen.blackbird hat geschrieben:Funktinoiert leider nicht. zwischen den Pipe Symbolen müssen übrigens keine leerzeichen vorkommen, was die Sache nicht gerade einfacher macht.
Code: Alles auswählen
[['replace', '"Hello"', '"he|he hehe"'], ['replace', 'NAME', 'user', 'username']]
Ich habs noch mal überarbeitet. Außerdem ist das nur ein Denkanstoß für dich, den du weiter ausbauen sollst.blackbird hat geschrieben:Ist nich das, was rauskommen soll.
ProgChild hat geschrieben:Ich habs noch mal überarbeitet. Außerdem ist das nur ein Denkanstoß für dich, den du weiter ausbauen sollst.blackbird hat geschrieben:Ist nich das, was rauskommen soll.
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Filter Parser
=============
source:
replace "Hello" "he|he hehe" | replace '$NAME$' user.username
result:
[['replace', '"Hello"', '"he|he hehe"'], ['replace', "'$NAME$'", 'user.username']]
"""
TOKEN_CDATA = 0
TOKEN_DOUBLE_QUOTED_STRING = 1
TOKEN_SINGLE_QUOTED_STRING = 2
TOKEN_DOUBLE_QUOTED_BACKSLASH = 3
TOKEN_SINGLE_QUOTED_BACKSLASH = 4
class EmptyTokenException(Exception): pass
class FilterLexer(object):
def __init__(self):
self._buffer = []
self._bufpos = 0
self._state = TOKEN_CDATA
self._valbuf = ''
self._tmpdata = []
self.data = []
def feed(self, data):
self._buffer.append(data)
try:
self.lex()
except EmptyTokenException:
pass
def finish(self):
self.feed('|')
def pop(self):
while self._buffer and self._bufpos >= len(self._buffer[0]):
del self._buffer[0]
self._bufpos = 0
if not self._buffer:
raise EmptyTokenException
rv = self._buffer[0][self._bufpos]
self._bufpos += 1
return rv
def lex(self):
while True:
if self._state == TOKEN_CDATA:
while True:
data = self.pop()
if data == '|':
self.handle_token(TOKEN_CDATA, self._valbuf)
self.handle_switch()
self._valbuf = ''
elif data in ' \t\r\n':
self.handle_token(TOKEN_CDATA, self._valbuf)
self._valbuf = ''
elif data == '"':
self.handle_token(TOKEN_CDATA, self._valbuf)
self._state = TOKEN_DOUBLE_QUOTED_STRING
self._valbuf = ''
break
elif data == "'":
self.handle_token(TOKEN_CDATA, self._valbuf)
self._state = TOKEN_SINGLE_QUOTED_STRING
self._valbuf = ''
break
else:
self._valbuf += data
if self._state == TOKEN_DOUBLE_QUOTED_STRING:
while True:
data = self.pop()
if data == '\\':
self._state = TOKEN_DOUBLE_QUOTED_BACHSLASH
break
elif data == '"':
self.handle_token(TOKEN_DOUBLE_QUOTED_STRING, self._valbuf)
self._state = TOKEN_CDATA
self._valbuf = ''
break
else:
self._valbuf += data
if self._state == TOKEN_SINGLE_QUOTED_STRING:
while True:
data = self.pop()
if data == '\\':
self._state = TOKEN_SINGLE_QUOTED_BACHSLASH
break
elif data == "'":
self.handle_token(TOKEN_SINGLE_QUOTED_STRING, self._valbuf)
self._state = TOKEN_CDATA
self._valbuf = ''
break
else:
self._valbuf += data
if self._state == TOKEN_DOUBLE_QUOTED_BACKSLASH:
self._valbuf += self.pop()
self._state = TOKEN_DOUBLE_QUOTED_STRING
if self._state == TOKEN_SINGLE_QUOTED_BACKSLASH:
self._valbuf += self.pop()
self._state = TOKEN_SINGLE_QUOTED_STRING
def handle_token(self, token_type, data):
if token_type == TOKEN_CDATA and data:
self._tmpdata.append(data)
elif token_type == TOKEN_SINGLE_QUOTED_STRING:
self._tmpdata.append('\'%s\'' % data)
elif token_type == TOKEN_DOUBLE_QUOTED_STRING:
self._tmpdata.append('"%s"' % data)
def handle_switch(self):
self.data.append(self._tmpdata)
self._tmpdata = []
def parse_filter(filterline):
lexer = FilterLexer()
lexer.feed(filterline)
lexer.finish()
return lexer.data
print parse_filter('replace "Hello" "he|he hehe" | replace \'$NAME\' user.username')
Code: Alles auswählen
replace "Hello" "he|he hehe" | replace '$NAME$' user.username | addslashes
Code: Alles auswählen
blubblub | blablabla | XXXX
Code: Alles auswählen
s = '''replace "Hello" "he|he hehe" | replace '$NAME$' user.username | addslashes'''
a = [[]]
quoted = False
tmp = ""
for sign in s:
if sign == '"': quoted = not quoted
if sign == '|' and not quoted:
a.append([])
elif sign == ' ' and not quoted:
if tmp:
a[-1].append(tmp)
tmp = ""
else:
tmp += sign
a[-1].append(tmp)
Klar ist das mit einer Funktion verbundenXT@ngel hat geschrieben:Hi blackbird,
Woher kommt dieser string:Ich frag mich gerade ob das replace und addslashes auch eine Funktion haben. Oder sind nur die | entscheidend die sich nicht zwischen zwei " befinden?Code: Alles auswählen
replace "Hello" "he|he hehe" | replace '$NAME$' user.username | addslashes
Code: Alles auswählen
{{ liste|removedouble|sort|slice 4:10|join ', ' }}
argh. so einfach. Wiedermal die Batterien übersprungen. Das ist wirklich was Feines. Blöderweise fehlen mir die dazugehörigen Quotes wodurch ich nicht rausfinden kann, ob das jetzt eine Stringkonstante oder eine Variable istBlackJack hat geschrieben:Hilft das `shlex` Modul eventuell beim "Tokenizen"?