Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Karl hat geschrieben:EnTeQuAk: Deine Lösung kann aber zum Beispiel nicht mit einem = in einem String umgehen, weil dann ein SyntaxError kommen müsste.
Außerdem wird ja immer gegen eval gepredigt
def split(s):
keys = [k for k in s if s[s.index(k)+1]=='=']
for i, item in enumerate(s):
if item == '=':
key = s[i-1]
if not key in keys:
continue
last_key = keys[-1] == key
if last_key:
value = s[i+1:]
else:
value = s[i+1:s.index(keys[keys.index(key)+1])-1]
yield key, value
def main():
ts = u'a=1 b="X =Y Z" c=True d=None'
print dict((k, eval(v)) for k,v in split(ts))
if __name__ == '__main__':
main()
Ansonsten sieht Masaru's Lösung auch nicht schlecht aus
€dit: Mist, geht auch nicht. Wenn X=Y im `b` value steht, gehts auch nicht. Vergesst die Lösung
>>> 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"
ValueError: No closing quotation
@Kurt Z: Ganz einfach mit einem Backslash vor dem entsprechenden Quote. Kleiner Tipp: Du hast da keins weil '\' in Python-Zeichenketten ja auch eine Bedeutung haben.
BlackJack hat geschrieben:@Kurt Z: Ganz einfach mit einem Backslash vor dem entsprechenden Quote. Kleiner Tipp: Du hast da keins weil '\' in Python-Zeichenketten ja auch eine Bedeutung haben.
m.a.W. es geht, aber Python-Code darf nicht die Quelle sein?
def make_kwagrs(raw_content):
"""
convert a string into a dictionary. e.g.:
>>> make_kwagrs('key1="value1" key2="value2"')
{'key2': 'value2', 'key1': 'value1'}
>>> make_kwagrs('A="B" C=1 D=1.1 E=True F=False G=None')
{'A': 'B', 'C': 1, 'E': True, 'D': '1.1', 'G': None, 'F': False}
"""
parts = shlex.split(raw_content)
result = {}
for part in parts:
key, value = part.split("=", 1)
if value in KEYWORD_MAP:
# True False or None
value = KEYWORD_MAP[value]
else:
# A number?
try:
value = int(value)
except ValueError:
pass
result[key] = value
return result
hat er nie präzisiert! Und shlex u/o Python scheinen andere Vorstellungen von escaping zu haben als normale shells wie bash!
>>> 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"
wie auch immer , ist euch mit ner Perl-RegEx gedient die ihr dann nach Python übersetzt?