2015-04-27 4 views
2

Я новичок на питоне.Нужна помощь в извлечении данных из файла

Так что мой файл имеет строки, которые выглядят следующим образом:

-1 1: -0,294118 2: 0,487437 3: 0,180328 4: -0,292929 5: -1 6: 0,00149028 7: -0.53117 8: - 0.0333333

мне нужно помощь, поступающий с правильным кодом питона, чтобы извлечь каждый поплавок двоеточием и с последующим пробелом (например: [-0.294118, 0.487437,etc...])

Я попытался dataList = re.findall(':(.\*) ', str(line)) и dataList = re.split(':(.\*) ', str(line)), но они придумали с целым е линии. Я изучаю эту проблему какое-то время, поэтому любая помощь будет оценена по достоинству. Благодаря!

ответ

1

попробовать это один:

:(-?\d\.\d+)\s 

В своем коде, который будет

p = re.compile(':(-?\d\.\d+)\s') 
m = p.match(str(line)) 
dataList = m.groups() 

Это более конкретно о том, что вы хотите.

В вашем случае. * Будет соответствовать все, что может

Тест на RegExr.ком:

enter image description here

В этом случае последний элемент не был захвачен, потому что он не имеет места, чтобы следовать, если это проблема просто удалить \ s из регулярных выражений

+0

Спасибо, это прекрасно! Я возился на regexr.com, но не мог понять. – Ana

0

Это будет сделать это:

import re 
line = "-1 1:-0.294118 2:0.487437 3:0.180328 4:-0.292929 5:-1 6:0.00149028 7:-0.53117 8:-0.0333333" 
for match in re.finditer(r"(-?\d\.\d+)", line, re.DOTALL | re.MULTILINE): 
    print match.group(1) 

Или:

match = re.search(r"(-?\d\.\d+)", line, re.DOTALL | re.MULTILINE) 
if match: 
    datalist = match.group(1) 
else: 
    datalist = "" 

Выход:

-0.294118 
0.487437 
0.180328 
-0.292929 
0.00149028 
-0.53117 
-0.0333333 

Живой Python Пример:

http://ideone.com/DpiOBq


Regex Демо:

https://regex101.com/r/nR4wK9/3


Regex Объяснение

(-?\d\.\d+) 

Match the regex below and capture its match into backreference number 1 «(-?\d\.\d+)» 
    Match the character “-” literally «-?» 
     Between zero and one times, as many times as possible, giving back as needed (greedy) «?» 
    Match a single character that is a “digit” (ASCII 0–9 only) «\d» 
    Match the character “.” literally «\.» 
    Match a single character that is a “digit” (ASCII 0–9 only) «\d+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
+0

Не могли бы вы прокомментировать нисходящий голос? –

0

Дано:

>>> s='-1 1:-0.294118 2:0.487437 3:0.180328 4:-0.292929 5:-1 6:0.00149028 7:-0.53117 8:-0.0333.333' 

С вашим конкретным примером данных, вы можете просто захватить те части, которые были бы часть поплавка с регулярным выражением:

>>> re.findall(r':([\d.-]+)', s) 
['-0.294118', '0.487437', '0.180328', '-0.292929', '-1', '0.00149028', '-0.53117', '-0.0333.333'] 

Вы также можете разделить и разбить, что будет значительно быстрее:

>>> [e.partition(':')[2] for e in s.split() if ':' in e] 
['-0.294118', '0.487437', '0.180328', '-0.292929', '-1', '0.00149028', '-0.53117', '-0.0333.333'] 

Затем вы можете преобразовать те к поплавку с помощью try/except и map и filter:

>>> def conv(s): 
...  try: 
...   return float(s) 
...  except ValueError: 
...   return None 
... 
>>> filter(None, map(conv, [e.partition(':')[2] for e in s.split() if ':' in e])) 
[-0.294118, 0.487437, 0.180328, -0.292929, -1.0, 0.00149028, -0.53117, -0.0333333] 
0

Простой Oneliner используя список понимание -

str = "-1 1:-0.294118 2:0.487437 3:0.180328 4:-0.292929 5:-1 6:0.00149028 7:-0.53117 8:-0.0333333" 
[float(s.split()[0]) for s in str.split(':')] 

Примечание: это проще понять (и, пожалуй, самый быстрый), поскольку мы не проводим никаких регулярных вычислений. Но это будет работать только для конкретного случая выше. (например, если вы должны получить второе число - в приведенной выше не так правильно отформатированной строке потребуется больше работы, чем один однострочный выше).

Смежные вопросы