gpt4 book ai didi

Python正则表达式从末尾匹配mac地址?

转载 作者:行者123 更新时间:2023-11-30 23:06:12 27 4
gpt4 key购买 nike

我有以下方法来提取 MAC 地址:

re.sub( r'(\S{2,2})(?!$)\s*', r'\1:', '0x0000000000aa bb ccdd ee ff' )

但是,这给了我0x:00:00:00:00:00:aa:bb:cc:dd:ee:ff

如何修改此正则表达式以在匹配从末尾开始的前 6 对后停止,以便得到 aa:bb:cc:dd:ee:ff

注意:字符串之间有空格,将被忽略。只需要最后 12 个字符。

编辑1: re.findall( r'(\S{2})\s*(\S{2})\s*(\S{2})\s *(\S{2})\s*(\S{2})\s*(\S{2})\s*$',a) 查找字符串中的最后 6 对。我仍然不知道如何压缩这个正则表达式。同样,这仍然取决于字符串成对的事实。

理想情况下,正则表达式应采用从末尾开始的最后 12 个有效 \S 字符,并使用 : 进行字符串化

Edit2: 受到 @Mariano 答案的启发,该答案效果很好,但取决于最后 12 个字符必须以一对开头的事实,我想出了以下解决方案。它很困惑,但似乎仍然适用于所有输入。

string = '0x0000000000a abb ccddeeff'
':'.join( ''.join( i ) for i in re.findall( '(\S)\s*(\S)(?!(?:\s*\S\s*{11})',' string) )
'aa:bb:cc:dd:ee:ff'

Edit3:@Mariano 更新了他的答案,现在适用于所有输入

最佳答案

这适用于最后 12 个字符,忽略空格。

代码:

import re

text = "0x0000000000aa bb ccdd ee ff"

result = re.sub( r'.*?(?!(?:\s*\S){13})(\S)\s*(\S)', r':\1\2', text)[1:]

print(result)

输出:

aa:bb:cc:dd:ee:ff

DEMO

<小时/>

正则表达式分割:

此代码中使用的表达式使用 re.sub() 替换主题文本中的以下内容:

.*?                 # consume the subject text as few as possible
(?!(?:\s*\S){13}) # CONDITION: Can't be followed by 13 chars
# so it can only start matching when there are 12 to $
(\S)\s*(\S) # Capture a char in group 1, next char in group 2
#
# The match is replaced with :\1\2
# For this example, re.sub() returns ":aa:bb:cc:dd:ee:ff"
# We'll then apply [1:] to the returned value to discard the leading ":"

关于Python正则表达式从末尾匹配mac地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32754141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com