Python Регулярное выражение для извлечения данных из строки - PullRequest
1 голос
/ 15 апреля 2020

Я пишу свой первый код Python, и у меня есть некоторые сомнения относительно Регулярного выражения. У меня есть переменная, которая содержит

a = "'PoE Port Info','1      up     medium    Auto Class         Searching             0       0.0         0           0.0','10     up     low       User defined 4(W) Searching             -       0.0         0           0.0'"

Мне нужно извлечь:

'1      up     medium    Auto Class         Searching             0       0.0         0           0.0'

и преобразовать строку в список строк со всеми удаленными пробелами

['1','up','medium','Auto Class','Searching','0','0.0','0','0.0']

аналогично

'10     up     low       User defined 4(W) Searching             -       0.0         0           0.0'

удалите пробелы и преобразуйте в список

['10','up','low','User defined,'4(W)','Searching','-','0.0','0','0.0']

все остальные оставшиеся данные в этой строке не должны совпадать.

Мой код:

a = "'PoE Port Info','1      up     medium    Auto Class         Searching             0       0.0         0           0.0','10     up     low       User defined 4(W) Searching             -       0.0         0           0.0'"
b= []
#split string with ,
a = a.split(",")
print(a)
for item in a:
    c = re.findall(r"[0-9]+[\s+[a-z]+]*[0-9]+",item, re.I)
    if c:
        #Replace whitespace character to spaces
        temp = re.sub(r'[\s]+',' ', c[0])
        #print(temp)
        b.append(temp.split(" "))
print(b)

Этот код работает, но я сталкиваюсь с проблемой регулярного выражения. Мой текущий вывод:

[['1', 'up', 'medium', 'Auto', 'Class', 'Searching', '0'], ['10', 'up', 'low', 'User', 'defined', '4']]

Некоторые, пожалуйста, помогите мне.

Как написать RE?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Если вы знаете, что нет необходимости проверять вложенные / экранированные одинарные кавычки, вы можете просто извлечь все поля с помощью одного регулярного выражения, которое захватит все поля в одном go. Проблема в четвертом поле, которое может содержать любое (количество) символов, поэтому вам нужно прописать шаблоны для других полей.

Вот пример регулярного выражения:

import re
a = "'PoE Port Info','1      up     medium    Auto Class         Searching             0       0.0         0           0.0','10     up     low       User defined 4(W) Searching             -       0.0         0           0.0'"
res = re.findall(r"(?!^)'(\d+)\s+(\w+)\s+(\w+)\s+([^']*?)\s+(\S+)\s+(\S+)\s+([\d.]+)\s+(\d+)\s+([\d.]+)'", a)
print(res)
# => [
#       ('1', 'up', 'medium', 'Auto Class', 'Searching', '0', '0.0', '0', '0.0'), 
#       ('10', 'up', 'low', 'User defined 4(W)', 'Searching', '-', '0.0', '0', '0.0')
#    ]

См. regex demo и Python demo

Подробности

  • (?!^)' - a ' не в начале строки
  • (\d+) - Группа 1: одна или несколько цифр
  • \s+ - 1+ пробелы
  • (\w+)\s+ - Группа 2: один или несколько символов слова и затем 1+ пробелы
  • (\w+)\s+ - Группа 3: один или несколько символов слова и затем 1+ пробелы
  • ([^']*?)\s+ - Группа 4: любая 0 или более символов, отличных от ', как можно меньше, затем 1+ пробелов
  • (\S+)\s+ - Группа 5: любые 1+ непробельных символов, затем 1+ пробелов
  • (\S+)\s+ - Группа 6: любые 1+ без пробелов, затем 1+ пробелов
  • ([\d.]+)\s+ - Группа 7: любые 1+ цифр / точек, затем 1+ пробелов
  • (\d+)\s+ - Группа 8: любые 1+ цифры, затем 1+ пробелы
  • ([\d.]+) - группа 9: любые 1+ цифр / точек
  • ' - ' символ.
1 голос
/ 15 апреля 2020

Я предлагаю вам воспользоваться онлайн-редактором регулярных выражений, например regex 101 , и протестировать там свою тестовую строку - гораздо проще создать правильный синтаксис там, и в окне информации о совпадении вы также увидите, какая группа это какая.

Возможно, я бы попытался создать набор из x групп (по одной для каждого необходимого значения). Нет необходимости в разделении и других операциях впоследствии.

...