Как написать "между" и "до", чтобы извлечь целые числа из текстового файла в Python?

У меня много строк, как показано ниже.

_:9:_:SER _ 9 SER S 3 0.000 66.878  
_:11:_:LEU _ 11 LEU E 8 0.000 67.168    
_:108:_:ARG _ 108 ARG   1 0.000 62.398  

Каждый элемент разделен пробелом. Потому что разные строки имеют разные номера (например, 9, 11, 108), последующие значения не выровнены в одинаковых позициях столбца. В 3-й строке есть 3 пробела между ARG а также 1 потому что эта строка не имеет этой информации, поэтому для ее заполнения используется пробел.

Мне нужно извлечь две информации

1) 9, 11, 108 значения в 1-й, 2-й и 3-й строках соответственно

2) 3, 8, 1 значения (до 0.000) на 1-й, 2-й и 3-й строках соответственно

Я хочу использовать Python для написания обобщенного скрипта для извлечения этой информации, вместо длинного if-then loop рассматривать однозначные, двузначные и трехзначные случаи по отдельности.

Моя идея примерно такая:

1) извлечь целочисленные значения между первым и вторым :

2) извлекать целочисленные значения после 5-го пробела, пока после этого значения не будет обнаружен другой пробел.

2 ответа

Решение

Если вы можете получить каждую строку в виде строки, вы можете сделать это:

your_line = "_:108:_:ARG _ 108 ARG   1 0.000 62.398"
splitted = your_line.split()
# splitted = ['_:108:_:ARG', '_', '108', 'ARG', '1', '0.000', '62.398']

По сути, он создает список строк из исходного списка, разделенных символом, который вы вводите. Если вы не дадите split() аргумент, то он просто разбивает строку на любой пробел.

Теперь вы можете легко извлечь нужную информацию:

info1 = splitted[2]
info2 = splitted[4]

Если вы извлекаете только числовые поля, вы можете использовать регулярное выражение \d+(?:\.\d+)?, который читает цифры, затем, возможно, точку и больше цифр.

Тогда вы можете использовать re.findall захватить числовые поля в виде списка, а затем работать с ними.

>>> fields = re.findall(r'\d+(?:\.\d*)?', lines[0])
>>> fields
['9', '9', '3', '0.000', '66.878']
>>> (fields[0], fields[2])
('9', '3')
Другие вопросы по тегам