Python - регулярное выражение анализировать числовое значение в массив без звездочки и пробела - PullRequest
2 голосов
/ 06 апреля 2019

Ниже приведены примеры данных. Я хотел бы извлечь первые два столбца чисел и поместить их в массив.

Набор данных:

      54     1%    2.11 MB  52 min       0.0    49.0    0.0  test1 test1_4.1.6_Win_x86_install_en-US.tar
      55    17%   31.89 MB  1 min        0.0  1263.0    0.0  test344 base-2.10.6-x86_64.dmg
      56    17%   31.18 MB  1 min        0.0  1267.0    0.0  test2 base-2.10.4-x86_64.dmg
      57    15%   27.12 MB  2 min        0.0  1066.0    0.0  test23 base-2.10.6-setup.exe
      58    20%   32.16 MB  1 min        0.0  1196.0    0.0  test232 base-2.10.8-x86_64-2.dmg
      59*    0%       None  599 days     0.0     0.0    0.0  test12 base.1.2_Linux_x86_deb.tar.gz
      60    14%   26.31 MB  2 min        0.0  1243.0    0.0  test23 base-2.10.4-setup-2.exe
      61     0%       None  Unknown      0.0     0.0   None  Idle base-0.9.24.1.exe
    Sum:          150.8 MB               0.0  6084.0

Текущие результаты:

    54     1
    55    17
    56    17
    57    15
    58    20
    60    14

Желаемые результаты:

    54     1
    55    17
    56    17
    57    15
    58    20
    59    0
    60    14
    61     0

Проблема:

Отсутствуют идентификаторы 59 и 0

Хотя я получил его, чтобы захватить первые два столбца.Кажется, я не могу захватить этот столбец звездочкой

Я пытаюсь понять, как улучшить раздел "\ s +" регулярного выражения, чтобы включить число и исключить звездочку.

Код:

    import re

    output4a = """
      54     1%    2.11 MB  52 min       0.0    49.0    0.0  test1 test1_4.1.6_Win_x86_install_en-US.tar
      55    17%   31.89 MB  1 min        0.0  1263.0    0.0  test344 base-2.10.6-x86_64.dmg
      56    17%   31.18 MB  1 min        0.0  1267.0    0.0  test2 base-2.10.4-x86_64.dmg
      57    15%   27.12 MB  2 min        0.0  1066.0    0.0  test23 base-2.10.6-setup.exe
      58    20%   32.16 MB  1 min        0.0  1196.0    0.0  test232 base-2.10.8-x86_64-2.dmg
      59*    0%       None  599 days     0.0     0.0    0.0  test12 base.1.2_Linux_x86_deb.tar.gz
      60    14%   26.31 MB  2 min        0.0  1243.0    0.0  test23 base-2.10.4-setup-2.exe
      61     0%       None  Unknown      0.0     0.0   None  Idle base-0.9.24.1.exe
    Sum:          150.8 MB               0.0  6084.0"""

    idPercentage3 = re.findall(r'^\s+([0-9]+)\s+([0-9]+)', output4a, flags=re.MULTILINE)
    print (idPercentage3)

спасибо

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Попробуйте это простое регулярное выражение:

^\s*(\d+)\D*(\d+)

Нажмите для демонстрации

Python-код для извлечения значений

Пояснение:

  • ^ - подтверждает начало строки
  • \s* - соответствует 0+ появлений пробела
  • (\d+) - сопоставляет и фиксирует 1+ вхождения цифры в группе 1
  • \D* - соответствует 0+ вхождений любого символа, не являющегося цифрой
  • (\d+) - сопоставляет и фиксирует 1+ вхождения цифры в группе 2
1 голос
/ 06 апреля 2019

Я бы порекомендовал ^\s*(\d+)\*?\s+(\d+), что делает буквальный символ * необязательным при ?.Я также сделал ваш первый космический запуск необязательным;кажется разумным позволить числам выравниваться с началом строки без заполнения (но вы можете изменить * обратно на +, если хотите).Наконец, \d эквивалентно [0-9].

Полный код:

import re

output4a = """
  54     1%    2.11 MB  52 min       0.0    49.0    0.0  test1 test1_4.1.6_Win_x86_install_en-US.tar
  55    17%   31.89 MB  1 min        0.0  1263.0    0.0  test344 base-2.10.6-x86_64.dmg
  56    17%   31.18 MB  1 min        0.0  1267.0    0.0  test2 base-2.10.4-x86_64.dmg
  57    15%   27.12 MB  2 min        0.0  1066.0    0.0  test23 base-2.10.6-setup.exe
  58    20%   32.16 MB  1 min        0.0  1196.0    0.0  test232 base-2.10.8-x86_64-2.dmg
  59*    0%       None  599 days     0.0     0.0    0.0  test12 base.1.2_Linux_x86_deb.tar.gz
  60    14%   26.31 MB  2 min        0.0  1243.0    0.0  test23 base-2.10.4-setup-2.exe
  61     0%       None  Unknown      0.0     0.0   None  Idle base-0.9.24.1.exe
Sum:          150.8 MB               0.0  6084.0"""

id_percentage3 = re.findall(
    r'^\s*(\d+)\*?\s+(\d+)', 
    output4a, flags=re.MULTILINE
)

for a, b in id_percentage3:
    print(a, b)

Вывод:

54 1
55 17
56 17
57 15
58 20
59 0
60 14
61 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...