Найти - Пользователи
Полная версия: Помогите пожалуйста с преобразованием строк
Начало » Центр помощи » Помогите пожалуйста с преобразованием строк
1 2 3
wghost
sp3
dict(c.split('=',1) for c in a.split())
Аналогичный результат, или я неправильно применил…
py.user.next
2.6
>>> s = 'key1=value1\nkey2=value2'         
>>> d = dict(p.split('=', 1) for p in s.splitlines())
>>> d
{'key2': 'value2', 'key1': 'value1'}
>>>
wghost
py.user.next
2.6
>>> s = 'key1=value1\nkey2=value2'         
>>> d = dict(p.split('=', 1) for p in s.splitlines())
>>> d
{'key2': 'value2', 'key1': 'value1'}
>>>
В общем я не знаю, результат получается всегда один:
{'key1': 'value1'}
{'key2': 'value2'}
Попробую подробней расписать что происходит.
Данные собираются регуляркой в “a”.
print a
('nenugno1', 'key1=value1', 'nenugno12')
('nenugno2', 'key2=value2', 'nenugno2')
Необходимы только значения ‘key=value’
print a[1]
key1=value1
key2=value2
И 'a' нужнно преобразовать в строку:
{'key1': 'value1', 'key2': 'value2'}
a фактически массив…, но питон рассматривает его как строку? Или я не прав…
s0rg
import libastral

print libastral.solve_problem()
Результат:

#!/usr/bin/env python
#-*- coding: utf8 -*-

import re

test = '''temp key1=value1 temp
temp key2=value2 temp
temp key3=value3 temp'''

rex = re.compile('(\w+) (\w+=\w+) (\w+)')

acc = list()

for ln in test.split('\n'):
m = rex.match(ln)
if m is not None:
acc.append(m.group(2))

res = dict([a.split('=', 1) for a in acc])

print res
wghost
import re
from grab import Grab

g = Grab()
#
g.go('http://python.net/')
#
rex = re.compile(r'(<meta name=".*?")(.*?)(/>)')
for data in rex.findall(g.response.body):
a = data[1]
d = dict(map(lambda x: x.split('=', 1), a.split()))
print d
Вывод:
{'content': '"SS3tlfjOjNLiOGzGlk9H9izd3XC/mf5PDQOTg4TDCE8="'}
{'content': '"index,follow"'}
{'content': '"en"'}
{'content': '"starship,python"'}
Traceback (most recent call last):
File "test.py", line 13, in <module>
d = dict(map(lambda x: x.split('=', 1), a.split()))
ValueError: dictionary update sequence element #1 has length 1; 2 is required
В данной ситуации еще не понятна причины ошибки, т.к. в ‘print a’ вроде все нормально:
 content="SS3tlfjOjNLiOGzGlk9H9izd3XC/mf5PDQOTg4TDCE8="
content="index,follow"
content="en"
content="starship,python"
content="The home of pythonistas"
content="various"
s0rg
Вы делаете print внутри цикла - и конечно же у вас ‘все нормально’ решения которые вам предлагались, предполагали, что в ‘a’ находится цельная строка.
Как вариант - ‘накапливать’ данные из ‘a’ в отдельной коллекции (см. мой предъидущий пост) и уже эту конечную коллекцию и обрабатывать.
Иначе у вас не получится общий словарь - только список словарей. Их можно ‘склеить’, но мне кажется, что вариант с промежуточным хранением удобнее.
wghost
Не очень понимаю как работает вариант с ‘накоплением’ данных в отдельную коллекцию…
Не удается найти внятного объяснеия на русском на счет ‘_sre.SRE_Match object at ’. И там ‘name ’acc' is not defined'.
А можно вариант со склейкой?
п.с. с ‘append()’ не должно работать вроде… ‘m.group(2)’ - полностью список а не отдельная строка…
Т.е. нужно каждую новую строку ‘key=value’ добавлять в конец списка, пока они существуют.
py.user.next
wghost
В общем я не знаю, результат получается всегда один:
Попробую подробней расписать что происходит.
Данные собираются регуляркой в “a”.
это не очень похоже на описание в первом сообщении

2.6
>>> a = [('nenugno1', 'key1=value1', 'nenugno12'),
... ('nenugno2', 'key2=value2', 'nenugno2')]
>>>
>>> d = dict(t[1].split('=', 1) for t in a)
>>> print d
{'key2': 'value2', 'key1': 'value1'}
>>>
s0rg
wghost
Не очень понимаю как работает вариант с ‘накоплением’ данных в отдельную коллекцию…
Для вашего случая:
acc = [d[1] for d in rex.findall(g.response.body)]
res = dict([a.split('=', 1) for a in acc])
print res
wghost
Спасибо, так заработало.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB