2016-03-04 2 views
2

Я пытаюсь получить значения из строки, как:печать выбранное значение из re.split

4 F= -0.15857709E+03 E0= -0.15857306E+03 d E =-0.612557E+01 mag= 111.0022 

Для печати только цифры, например, как:

4 -0.15857709E+03 -0.15857306E+03 -0.612557E+01 111.0022 

я делаю:

indices = [1, 4, 7, 11, 14] 
slist = re.split(" +|=|\n", line)# for i in indices) 
qlist =[slist[i] for i in indices] 
print(*qlist) 

Должен ли я сделать все это? (Я имею в виду, я создаю 2 списка, чтобы печатать числа).

Есть ли лучший способ сделать это (непосредственно из re.split, может быть)?

я пытался: ошибка

 print(re.split(" +|=|\n", line)[i] for i in indices) 

который дающую:
< объект генератора < genexpr> в 0x7f90bfbb80d8>

NB Это будет создан список 2-D, как:

1 -0.15245151E+03 -0.15244677E+03 -0.152452E+03 104.3267 
2 -0.15552770E+03 -0.15552383E+03 -0.307619E+01 108.0036 
3 -0.15807566E+03 -0.15807147E+03 -0.562415E+01 111.0046 
4 -0.15857709E+03 -0.15857306E+03 -0.612557E+01 111.0022 
+0

ли формат строки всегда то же самое? – Alex

+0

yes ... its always same – BaRud

ответ

4

Возможно, что-то вроде этого:

>>> import re 
>>> s = "4 F= -0.15857709E+03 E0= -0.15857306E+03 d E =-0.612557E+01 mag= 111.0022" 
>>> re.findall(r'[+-]?(?<!E)\d+(?:\.\d+(?:E[+-]\d+)?)?', s) 
['4', '-0.15857709E+03', '-0.15857306E+03', '-0.612557E+01', '111.0022'] 

Regular expression visualization

Debuggex Demo

+0

Я работал над чем-то вроде этого ... yea..fixing выражение 're' - это то, что я сделал бы, вместо того, чтобы возиться с более' split' и 'strip' ... –

+0

Это работает, потому что в 'E0', 0 предшествует' E', но я предполагаю, что это не всегда так. Например, он не сработает для 's =" 4 F = -0.15857709E + 03 D0 = -0.15857306E + 03 d E = -0.612557E + 01 mag = 111.0022 ", потому что он возвращает дополнительный 0.Вероятно, вы должны использовать другое отрицательное утверждение, например '(?

+0

@VincentSavard. Мы можем заменить 'E' на' [a-zA-Z] ', если это так. –

2

Вы можете использовать следующее регулярное выражение:

import re 

s = '4 F= -0.15857709E+03 E0= -0.15857306E+03 d E =-0.612557E+01 mag= 111.0022' 
qlist = [s.split()[0]] + [x.strip() for x in re.findall(r'(?<==)\s*[^ ]+', s)] 
print(qlist) 

Выход

['4', '-0.15857709E+03', '-0.15857306E+03', '-0.612557E+01', '111.0022'] 

Первое число извлекается с помощью str.split() для простоты. Затем оставшуюся часть числовых строк извлекают с использованием регулярного выражения и, если необходимо, лишают пробелы на обоих концах.

0

Я хотел бы попробовать следующее регулярное выражение.

([-]?\d+(?:\.\d+(?:E[+-]\d+)?)?)(?=(?:\s|$)) 

Образец кода.

import re 
p = re.compile(r'([-]?\d+(?:\.\d+(?:E[+-]\d+)?)?)(?=(?:\s|$))') 

test_str = "4 F= -0.15857709E+03 E0= -0.15857306E+03 d E =-0.612557E+01 mag= 111.0022" 

matches = re.findall(p, test_str) 

Учитывая ваш входной выборки строки и запуска демо, выход будет

['4 ', '-0.15857709E+03 ', '-0.15857306E+03 ', '-0.612557E+01 ', '111.0022'] 

Пожалуйста, смотрите демо на https://regex101.com/r/sO0aD8/3

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