RegEx工作,但我不知道为什么!?说明

时间:2017-10-04 17:57:43

标签: python regex

不要激怒蟒蛇神,但我需要对有效的东西进行解释。 我正在研究Cisco路由器中ARP表的输出。我在IP地址之前和MAC地址之后过滤了所有内容。 (简单) 然后我需要过滤出IP和IP之间的ARP时代。苹果电脑。这可以和不同数量的空格后跟连字符或1到3位数字然后更多空格。

我正在捕捉连字符或单个数字,但从不会有2或3位数字以及周围的空格。 我不得不放入模式4以使其工作。 不应该strPattern3中的 \ d + 捕捉[空格] [连字符或数字] [空格]?

    strPattern3 = re.compile('(\s+[-\d+]\s+)')  #Catch any spaces then a hypen or digits followed by spaces (ARP age)
    strPattern4 = re.compile('(\s+\d+\s+)')     #Catch any spaces then any digits then any more spaces (ARP age)

    szResult = strPattern3.sub('\t', szResult)
    szResult = strPattern4.sub('\t', szResult)


    SAMPLE ARP TABLE
        Internet  10.241.130.14         159   f0d5.bf04.e3b8  ARPA   GigabitEthernet0/0.20
        Internet  10.241.130.17           1   ecf4.bb6b.918a  ARPA   GigabitEthernet0/0.20
        Internet  10.241.130.19          47   f01f.af10.7a45  ARPA   GigabitEthernet0/0.20
        Internet  10.241.130.20           0   5475.d0ab.a86c  ARPA   GigabitEthernet0/0.20
        Internet  159.142.132.97          -   6073.5cc5.6598  ARPA   GigabitEthernet0/0.20

2 个答案:

答案 0 :(得分:0)

使用[]环绕-\d+表示您在Python正则表达式中使用character class。这意味着匹配[] 之间包含的任何内容,因此它会查找文字-,数字或+字符。 +量词在字符类中失去意义。

如果你想匹配一系列空格,然后是连字符 1-3位数,那么更多空格,你的正则表达式看起来更像这样:

pattern = re.compile('(\s+(?:-|\d{1,3})\s+)')

答案 1 :(得分:0)

首先,you don't need regex针对此问题:

for line in s.split('\n'):  # or open a file and read it line by line
    if "ARPA" in line:  # or some other indicator of target lines
        sline = line.split()
        ip, mac = sline[1], sline[3]
        print ip, mac

产量

10.241.130.14 f0d5.bf04.e3b8
10.241.130.17 ecf4.bb6b.918a
10.241.130.19 f01f.af10.7a45
10.241.130.20 5475.d0ab.a86c
159.142.132.97 6073.5cc5.6598

如果你必须使用正则表达式,我将来建议在样本数据上使用regex101.com或其他一些正则表达式测试程序。请注意,它包括视觉匹配标识以及正则表达式本身的细分解释。

在这种情况下,你正在寻找的正则表达式可能是\s+(?:-|\d+)\s+(点击它在regex101上查看) 这是:

  • 至少一个空格,
  • 短划线或任意位数,
  • 至少一个空间。

(?:a|b)non-capturing group,告诉|,我们只想or a和{{} 1}},而不是正则表达式的其余部分,并且外部分组b不必使用()