不要激怒蟒蛇神,但我需要对有效的东西进行解释。 我正在研究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
答案 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
不必使用()
。