Verfasst: Donnerstag 10. Juli 2008, 15:56
Das sind 2 Zeilen in PyParsing
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
hat er nie präzisiert! Und shlex u/o Python scheinen andere Vorstellungen von escaping zu haben als normale shells wie bash!Masaru hat geschrieben: SoCode: Alles auswählen
>>> print '\'' ' >>> print """ "
wie auch immer , ist euch mit ner Perl-RegEx gedient die ihr dann nach Python übersetzt?>>> print "a=1 b='X \\' Y Z' c=True d='test' e=None"
a=1 b='X \' Y Z' c=True d='test' e=None
>>> shlex.split("a=1 b='X \\' Y Z' c=True d='test' e=None")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/usr/lib/python2.3/shlex.py", line 279, in split
return list(lex)
File "/usr/lib/python2.3/shlex.py", line 269, in next
token = self.get_token()
File "/usr/lib/python2.3/shlex.py", line 96, in get_token
raw = self.read_token()
File "/usr/lib/python2.3/shlex.py", line 172, in read_token
raise ValueError, "No closing quotation"
Kurt Z hat geschrieben:Und shlex u/o Python scheinen andere Vorstellungen von escaping zu haben als normale shells wie bash!
funktioniert auch in einer "normalen" Shell nicht.'\''
aber es funktioniert in Python, deswegen soll er die Grammatik ja präzisieren!Trundle hat geschrieben:Kurt Z hat geschrieben:Und shlex u/o Python scheinen andere Vorstellungen von escaping zu haben als normale shells wie bash!funktioniert auch in einer "normalen" Shell nicht.'\''
Code: Alles auswählen
>>> print 'a\'b'
a'b
Code: Alles auswählen
value = int(value.strip("'\""))
Code: Alles auswählen
#!/usr/bin/perl
$parse = << '__HERE';
a=1 b='X Y\\' c=True d="test" e=None
f='\'' g='"' h="'" i='\\\\' j="True"
__HERE
print qq{
Folgende Ausdrcke werden zerlegt:
$parse
};
# matche alle Zeichenfolgen die mit einer geraden Anzahl \ enden
$escaped_string = qr{
.*? # nongreedy
(?<!\\) # kein vorausgehendes '\'
(?:\\\\)* # beliebig viele '\\'
}x;
print qq{
String "zerbrseln" und quotes entfernen, ergibt:
};
%dict=( # Match-Liste paarweise Hash zuweisen
grep { defined } # nonmatches ausfiltern
$parse =~ m/
(\w+) # identifier
= # operator
(?: # oder non-grouping
'( $escaped_string )' | # singlequote
"( $escaped_string )" | # doublequote
(\w+) # identifier
)
(?:\s|$)
/xg
);
print "$_ => $dict{$_} \n"
for (sort keys %dict) ;
print qq{
Bei folgender Variante werden die Quotezeichen mitgegriffen
innere matches im Oder entfallen, deswegen mssen auch keine
undef matches ausgefiltert werden.
Vorteil: zwischen a=True und a='True' kann unterschieden werden
};
%dict=( # Match-Liste paarweise Hash zuweisen
$parse =~ m/
(\w+) # identifier
= # operator
( # oder grouping
' $escaped_string ' | # singlequote
" $escaped_string " | # doublequote
\w+ # identifier
)
(?:\s|$)
/xg
);
print "$_ => $dict{$_} \n"
for (sort keys %dict) ;
Folgende Ausdrcke werden zerlegt:
a=1 b='X Y\\' c=True d="test" e=None
f='\'' g='"' h="'" i='\\\\' j="True"
String "zerbrseln" und quotes entfernen, ergibt:
a => 1
b => X Y\\
c => True
d => test
e => None
f => \'
g => "
h => '
i => \\\\
j => True
Bei folgender Variante werden die Quotezeichen mitgegriffen
innere matches im Oder entfallen, deswegen mssen auch keine
undef matches ausgefiltert werden.
Vorteil: zwischen a=True und a='True' kann unterschieden werden
a => 1
b => 'X Y\\'
c => True
d => "test"
e => None
f => '\''
g => '"'
h => "'"
i => '\\\\'
j => "True"
Ich brauche das in PyLucid um in einem Template Tag Parameter setzten zu können. Diese werden dann der view Funktion als Keyword-Arguments übergeben, bsp:Kurt Z hat geschrieben:Grundsätzlich stellt sich die Frage wozu du hier eigentlich diese neue Grammatik brauchst .und nicht eine wohl erpobte heranziehst, wie Pythonsyntax, YAML oder JSON.
Code: Alles auswählen
{% lucidTag RSS url="http://domain.tld/feed.xml" title="Ein feed" %}
Code: Alles auswählen
{ "url": "http://domain.tld/feed.xml", "title": "Ein feed" }
IMHO versuchst du Attributezuwesiungen aus der XML-Grammatik nachzubauen, dann modifiziere doch lieber gleich einen existierenden XML-Parser entsprechend.jens hat geschrieben: bsp:-> RSS.lucidTag(url, title)Code: Alles auswählen
{% lucidTag RSS url="http://domain.tld/feed.xml" title="Ein feed" %}