Hi wie gesagt kannst du mit RegEx auch escaping rausfiltern, der trick ist das bis zu einem Quote gegriffen werden muss, dem eine gerade Anzahl von Backslashes vorausgehen.
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.
Beispielcode kann ich dir mangels Pythonkenntnisse nur in Perl geben, Übersezung sollte eine Fleißaufgabe sein:
(meine emacs Indetation geht wg Tabs kaputt)
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"