Форум сайта python.su
У меня есть данные в фомате “Ключ = значение”, записаны в строку через пробелы, количество пролов между элементами зависит только от фазы луны.
Моя задача - получить в список все значения.
import re
raw = ' x=-125.789 y = .125E+5 z= 25. w = -.254E-5'
pat = '(?<==)\s*[+-E\d\.]+'
re.findall(pat, raw)
...
['-125.789', ' .125E+5', ' 25.', ' -.254E-5']
import re
raw = ' x=-125.789 y = .125E+5 z= 25. w = -.254E-5'
pat = '(?<==)\s*[+-E\d\.]+'
[x.strip() for x in re.findall(pat, raw)]
...
['-125.789', '.125E+5', '25.', '-.254E-5']
import re
raw = ' x=-125.789 y = .125E+5 z= 25. w = -.254E-5'
pat = '(?<==\s*)[+-E\d\.]+'
re.findall(pat, raw)
...
error: look-behind requires fixed-width pattern
Офлайн
pat = '(?<==)\s*([+-E\d\.]+)'
Офлайн
pasaranaxхм. Работает. А в чём дело?волшебные скобочки )pat = '(?<==)\s*([+-E\d\.]+)'
Офлайн
Скобки обособляют часть выражения. Вообще, у меня случайно получилось, я не думал, что re.findall будет выводить только обособленные скобками выражения. Если выделить несколько частей в скобки, то будет возвращен кортеж из этих выражений, таким образом можно выделить кроме значений еще и имена ключей.
pat = '\s*(\w*)\s*=\s*([+-E\d\.]+)'
Офлайн
pasaranaxВот ведь как бывет :)
Вообще, у меня случайно получилось, я не думал, что re.findall будет выводить только обособленные скобками выражения.
pat = '\s*(\w*)\s*=\s*([+-E\d\.]+)'
raw = """ x=-125.789 comment1 y = .125E+5 z= 25. comment2 w = -.254E-5 d45 =123.e-2"""
regexp = "(\w*)\s*=\s*([+-eE\d\.]+)"
print dict((x[0], str(float(x[1]))) for x in re.findall(regexp, raw))
...
{'y': '12500.0', 'x': '-125.789', 'z': '25.0', 'd45': '1.23', 'w': '-2.54e-06'}
Отредактировано (Сен. 12, 2009 23:31:31)
Офлайн
\w соответствует одному символу, а \w* соответствует 0-inf символам. И, пожалуй \w* стоит заменить на \w+, чтобы не получалось, что ключа может и не быть. А минус внутри квадратных скобок желательно тоже экранировать, потому что он там является спецсимволом, указывающим на диапазон (например, ), и будь он не справа от плюса, получилась бы ошибка.
Офлайн
pasaranaxА я по описанию почему-то понял что \w соответствует всему слову :(
\w соответствует одному символу, а \w* соответствует 0-inf символам.
pasaranaxДо такой ошибки я уже доэкстпериментировался :)
А минус внутри квадратных скобок желательно тоже экранировать, потому что он там является спецсимволом, указывающим на диапазон (например, ), и будь он не справа от плюса, получилась бы ошибка.
raw = """section x=-125.789 y = .125E+5 z= 25. section w = -.254E-5 d45 =123.e-2"""
... "Должно получится"
[[('x', '-125.789'), ('y', '.125E+5')], [('w', '-.254E-5'), ('d45', '123.e-2')]]
Отредактировано (Сен. 13, 2009 00:09:44)
Офлайн
Это уже слишком сложно, тут нужно в 2 прохода - сначала секции выделить, а потом то, что выше делали, в каждой секции.
Офлайн
pasaranaxЭхх. А так хотелось :)
тут нужно в 2 прохода
Офлайн
есть фрагмент кода:
temp = re.findall("[(.*),", text)
Офлайн