使用regex在字符串中多次拆分

2024-05-29 03:05:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串:

 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=重新编译('[\w\s]+:')和split函数。 我能做什么请帮我谢谢


Tags: 函数字符串逻辑splitstationdisconnect绳子b8
2条回答

据我所见,如果在匹配项中有一个带有十六进制值的空格,就有问题了。你知道吗

正因为如此,我相信你不能在这里使用分裂的方法。将您的令牌与regex匹配,如

(?<!\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: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-尾随词边界。你知道吗

在这种情况下,您可以这样实现:

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']

正则表达式:

(?<=[A-Z0-9])-A-Z或0-9的正向后视

- 1 space character

(?=[A-Z])-对A-Z的正面展望

相关问题 更多 >

    热门问题