如何计算正则表达式字符串python 3中的所有匹配项

2024-09-30 06:28:56 发布

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

我正在尝试对包含MAC地址的文本文件运行正则表达式。它匹配所有四行,但只计算2。我是python新手,出于某种原因,我无法理解这一点。代码如下:

regmac = re.compile("^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$")

regmac1 = "^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$"

with open(file, 'r') as i:
    for line in i.read().split('\n'):
        #matches = re.findall(regmac1, line)
        matches = regmac.findall(line)
        print(matches.count(regmac1)))
    
        macmatch = len(matches)
        macmatch += 1
    print(macmatch)

这将返回以下内容:

C:/Users/jonat/desktop/mactest1.txt
['AE:30:5B:AA:65:7B', '9C:30:5B:BB:66:7B', 'AE:30:5B:CC:67:7B', '9C:30:5B:DD:68:7B']
0
0
0
0
2

我已经检查了论坛等,这是我结束了,任何在正确的方向推动将不胜感激,谢谢


Tags: remac地址linefaprintmatches文本文件
1条回答
网友
1楼 · 发布于 2024-09-30 06:28:56

每次转到新行时,都会重置macmatch。在for循环外部初始化macmatch,然后它就会工作。你的正则表达式中也有很多捕获组,这可能会影响你的比赛计数。可以在括号内使用?:来防止创建捕获组,如下所示:

^((?:[a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|(?:[a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$

如果您没有尝试验证MAC地址的准确性,而是只查找看起来像MAC地址的字符串(因此9C:30:5B:BB-66-7B也是可以接受的),您可以显著缩短正则表达式:

^((?:[a-fA-F0-9]{2}[:-]){5}[a-fA-F0-9]{2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$

然后您可以运行:

with open(file, 'r') as i:
    macmatch = 0
    for line in i.readlines():
        matches = regmac.findall(line)
        macmatch += len(matches)
        # OR: macmatch += (1 if matches else 0)

    print(macmatch)

相关问题 更多 >

    热门问题