2017-02-06 4 views
1

У меня есть строка:многократный раскол в строку, используя регулярное выражение

Station Disconnect:1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.8 StaMAC:00:9F:0B:00:38:B8 BSSID:00 9F Radioid:2 

Я хочу разделить эту строку. Это выглядит следующим образом -

'Station Disconnect:1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.8' 'StaMAC:00:9F:0B:00:38:B8' 'BSSID:00 9F' 'Radioid:2' 

Я попробовал эту логику - msgRegex = re.compile ('[\ ш \ S] +:') и расщепленной функции также. Как я могу сделать, пожалуйста, помогите мне Спасибо

+0

Простой раскол с пространством. 'str.split ('')' –

+0

Это не дает правильного вывода @VivekKumar – Prafulla

+0

Я использовал функцию разделения и регулярное выражение также msgRegex = re.compile ('[\ w \ s] +:') @RedBassett – Prafulla

ответ

1

Из того, что я вижу, у вас есть проблема, когда у вас есть пробелы внутри спичек с шестнадцатеричные значения.

Из-за этого, я считаю, вы не можете использовать подход разделения. Сопоставьте лексемы с регулярным выражением, как

(?<!\S)\b([^:]+):((?:[a-fA-F0-9]{2}(?:[ :][a-fA-F0-9]{2})*|\S)+)\b 

См regex demo

Python code:

import re 

rx = r"(?<!\S)\b([^:]+):((?:[a-fA-F0-9]{2}(?:[ :][a-fA-F0-9]{2})*|\S)+)\b" 
ss = ["Station Disconnect:1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.8 StaMAC:00:9F:0B:00:38:B8 BSSID:00 9F Radioid:2", 
    "Station Deassoc:1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.5 StaMac1:40:83:DE:34:04:75 StaMac2:40:83:DE:34:04:75 UserName:4083de340475 StaMac3:40:83:DE:34:04:75 VLANId:1 Radioid:2 SSIDName:Devices SessionDuration:12 APID:CN58G6749V AP Name:1023-noida-racking-zopnow BSSID:BC:EA:FA:DC:A6:F1"] 
for s in ss: 
    matches = re.findall(rx, s) 
    print(matches) 

Результат:

[('Station Disconnect', '1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.8'), ('StaMAC', '00:9F:0B:00:38:B8'), ('BSSID', '00 9F'), ('Radioid', '2')] 
[('Station Deassoc', '1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.5'), ('StaMac1', '40:83:DE:34:04:75'), ('StaMac2', '40:83:DE:34:04:75'), ('UserName', '4083de340475'), ('StaMac3', '40:83:DE:34:04:75'), ('VLANId', '1'), ('Radioid', '2'), ('SSIDName', 'Devices'), ('SessionDuration', '12'), ('APID', 'CN58G6749V'), ('AP Name', '1023-noida-racking-zopnow'), ('BSSID', 'BC:EA:FA:DC:A6:F1')] 

ПРИМЕЧАНИЕ: Если вам не нужны никакие кортежи в результат, удалите захват скобки из шаблона.Подробнее

Pattern:

  • (?<!\S)\b - начало строки или пробел следуют с границей слова (следующий символ должен быть буквой/цифрой или _)
  • ([^:]+) - Захватив группа # 1: 1 + кроме :
  • : символов - двоеточия
  • ((?:[a-fA-F0-9]{2}(?:[ :][a-fA-F0-9]{2})*|\S)+) - Захват 2 группы соответствия один или несколько вхождения:
    • [a-fA-F0-9]{2}(?:[ :][a-fA-F0-9]{2})* - 2 шестнадцатеричных символов следуют с нулем или более вхождений пространства или : и 2 шестнадцатеричных символов
    • | - или
    • \S - в непробельный полукокса
  • \b - конечная граница слова.
+0

'Desc: Unknown Failure APID: CN58G6749V BSSID: BC: EA: FA: DC: A6: F0 AuthMode: 1 AP MAC: BC: EA: FA: DC: A6: E0' Для этого типа линии это не работает – Prafulla

+0

Выход должен быть: ['Desc: Unknown Failure' 'APID: CN58G6749V' 'BSSID: BC: EA: FA: DC: A6: F0' 'AuthMode: 1' 'AP MAC: BC: EA: FA : DC: A6: E0 '] – Prafulla

+0

Всего в секундах: как вы разделите ключ от значения? Этот пример разрушает всю логику, и ключи нельзя отличить от значений с регулярным выражением, так как оба ключа и значения могут иметь произвольное количество пробелов внутри них. –

1

В данном конкретном случае вы можете реализовать его следующим образом:

import re 

a = 'Station Disconnect:1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.8 StaMAC:00:9F:0B:00:38:B8 BSSID:00 9F Radioid:2' 
print re.split(r'(?<=[A-Z0-9]) (?=[A-Z])', a) 

Выход:

['Station Disconnect:1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.8', 'StaMAC:00:9F:0B:00:38:B8', 'BSSID:00 9F', 'Radioid:2'] 

Regex:

(?<=[A-Z0-9]) - Положительно lookbehind для AZ или 0-9

- 1 символ пробела

(?=[A-Z]) - Positive смотреть вперед для A-Z

+0

Все еще он дает что-то неправильное. line = 'Станция Deassoc: 1.3.6.1.4.1.11.2.14.11.15.2.75.3.2.0.5 StaMac1: 40: 83: DE: 34: 04: 75 StaMac2: 40: 83: DE: 34: 04: 75 UserName : 4083de340475 StaMac3: 40: 83: DE: 34: 04: 75 VLANId: 1 Radioid: 2 SSIDName: Devices SessionDuration: 12 APID: CN58G6749V AP Имя: 1023-noida-racking-zopnow BSSID: BC: EA: FA: DC: A6: F1 ' – Prafulla

+0

Дайте мне немного времени, я посмотрю. – MYGz

+0

Вы проверили эту проблему? Спасибо @MYGz – Prafulla

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