使用正则表达式在字符串中多次拆分

时间:2017-02-06 10:19:54

标签: python regex python-2.7 split

我有一个字符串:

 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(' [\ w \ s] +:')和分割功能。 我该怎么办请帮助我谢谢

2 个答案:

答案 0 :(得分: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']

输出:

(?<=[A-Z0-9])

正则表达式:

- A-Z或0-9

的正面观察

(?=[A-Z]) - 1个空格字符

$('#adding').submit(function(e) { var formData = new FormData($(this)); e.preventDefault(); $.ajax({ type: "POST", url: 'api.php?do=add', data: formData , contentType: false, processData: false, cache: false, success: function(data) { if (data === 'KO'){ document.getElementById("error").innerHTML = "Alert"; } if (data === 'OK'){ document.getElementById("error").innerHTML = "OK"; } } }); - 正面展望A-Z

答案 1 :(得分: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')] 

注意:如果结果中不需要元组,请从模式中删除捕获括号。

模式详情

  • (?<!\S)\b - 字符串或空格的开头,后跟字边界(下一个字母必须是字母/数字或_
  • ([^:]+) - 捕获第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 - 尾随字边界。