2017-02-14 2 views
0

У меня есть следующее регулярное выражение, которое работает, когда нет ведущего/d, «Существует один интерфейс на системе:Regex найти все между

или замыкающее», 2017-01 -...

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

(?m)(?<_KEY_1>\w+[^:]+?):\s(?<_VAL_1>[^\r\n]+)$ 

Вот пример того, что я пытаюсь разобрать:

1,"There is 1 interface on the system: 
    Name    : Mobile Broadband Connection 
    Description  : Qualcomm Gobi 2000 HS-USB Mobile Broadband Device 250F 
    GUID    : {1234567-12CD-1BC1-A012-C1A1234CBE12} 
    Physical Address : 00:a0:c6:00:00:00 
    State    : Connected 
    Device type  : Mobile Broadband device is embedded in the system 
    Cellular class  : CDMA 
    Device Id   : A10000f67 
    Manufacturer  : Qualcomm Incorporated 
    Model    : Qualcomm Gobi 2000 
    Firmware Version : 09010091 
    Provider Name  : Verizon Wireless 
    Roaming   : Not roaming 
    Signal    : 67%",2017-01-20T16:00:07.000-0700 

I пытаюсь извлечь имена полей, где, например Cellular класса будет равна CDMA, но и для всех полей, начинающихся после:

1,"There is 1 interface on the system: (where 1 increments 1,2 3,4 and so on 

и до хвостохранилища», 2017-01 ....

Любая помощь очень ценится !

+0

Могу ли я спросить, почему ваша строка так долго? Не может ли каждая отдельная информация быть собственной строкой? – jdmdevdotnet

+0

Проверьте https://regex101.com/r/qmuNpg/2. Что-то вроде того? – ClasG

+0

Вернее https://regex101.com/r/qmuNpg/3 – ClasG

ответ

1

Вы можете использовать опцию look-ahead, чтобы убедиться, что строки, которые вы сопоставляете, приходят до последовательности ",\d и не включают ". Последний обеспечит Вам будет соответствовать только между двойными кавычками, из которых второй имеет рисунок ",\d:

/^\h*(?<_KEY_1>[\w\h]+?)\h*:\h*(?<_VAL_1>[^\r\n"]+)(?="|$)(?=[^"]*",\d)/gm 

видеть на regex101

NB: Я поставил g и m модификаторов в конце, но если ваша среда требует их с самого начала с нотой (?m), это тоже будет работать.

0

Ваша строка примера представляет собой запись из файла csv. Это, как я выполнить задачу с Python (2.7 или 3.x):

import csv 

with open('file.csv', 'r') as fh: 
    reader = csv.reader(fh) 
    results = [] 

    for fields in reader: 
     lines = fields[1].splitlines() 
     keyvals = [list(map(str.strip, line.split(':', 1))) for line in lines[1:]] 
     results.append(keyvals) 

    print(results) 

Это может быть сделано аналогичным образом с другими языками.

0

Вы не ответили на мои комментарии или любой из ответов, но вот мой ответ - попробуйте

^\s*(?<_KEY_1>[\w\s]+?)\s*:\s*(?<_VAL_1>[^\r\n"]+).*$ 

See it here at regex101.

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