Как извлечь число между строками с помощью регулярных выражений - PullRequest
1 голос
/ 28 мая 2019

У меня есть следующий текст

Индикатор Stat: 01245 Загруженные значения

Некоторые несущественные данные

Индикатор Stat: 13452 Загруженные значения

Мой вывод должендайте мне номера 01245, 13452

Вот что я пробовал

with open('test.txt') as fd:
    data = fd.read()
val_to_pattern = {'stat': r'Stat indicator : .{5}\n'}
val_dict = {}
for key, patt in val_to_pattern.items():
    val_dict[key] = re.findall(patt, data)

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Использование

val_to_pattern = {'stat': r'Stat indicator\s*:\s*(\d+)'}

Обратите внимание, что шаблон \s*:\s* соответствует :, опционально обернутому 0+ пробелами, а часть (\d+) соответствует, а захватывает в группу 1 в любом 0+ цифры (обратите внимание, что re.findall возвращает только захваченные подстроки, если в регулярном выражении установлены группы захвата).

См. демонстрационное выражение регулярного выражения (зеленый текст будетрезультат).

В качестве альтернативы, если количество цифр в статистике индикатора всегда равно 5, используйте любое из значений:

 val_to_pattern = {'stat': r'Stat indicator\s*:\s*(\d{5})\b'}
 val_to_pattern = {'stat': r'Stat indicator\s*:\s*(\d{5})(?!\d)'}

\b - это граница слова, для которой требуется не-слово charили конец строки после 5 цифр, и (?!\d) - это отрицательный сигнал, который не соответствует совпадению, если справа от текущего местоположения есть цифра.

0 голосов
/ 29 мая 2019

Если вы не хотите использовать регулярные выражения, вы можете реализовать простой цикл.

  1 with open('test.txt') as fd:
  2     data = fd.read()
  3
  4 nums = []
  5 temp = ""
  6 is_dig = False
  7 for char in data:
  8      if char.isdigit():
  9           temp += char
 10           is_dig = True
 11      elif is_dig:
 12           nums.append(temp)
 13           temp = ""
 14           is_dig = False
 15 print(nums)
0 голосов
/ 28 мая 2019

Вы можете использовать регулярное выражение \d, и если вы знаете размер своего номера, вы можете использовать {size} с ним.

\ d {3} Возвращает совпадение, в котором строка содержит 3 цифры (числа из 0-9)

\ d {3,5} Возвращает совпадение, в котором строка содержит от 3 до 5 цифр. (цифры от 0 до 9)

Таким образом, вы можете использовать r'\d{3,5}' в качестве шаблона регулярного выражения

import re

with open('test.txt') as fd:
    data = fd.read()
val_to_pattern = {'stat': r'\d{5}'}
val_dict = {}
for key, patt in val_to_pattern.items():
    re_find = re.findall(patt, data)
    val_dict[key] = re.findall(patt, data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...