Python:在delimeters之后提取特定数量的字符

2024-04-23 08:10:46 发布

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

我有一个有多行固定语法的文件。每行文件如下所示:

13:09:04.210262 2.0 Mb/s 2412 MHz 11g -22dB signal antenna 7 BSSID:00:00:00:12:34:56 (oui Unknown) DA:01:23:45:67:89:78 (oui Unknown) SA:89:12:33:45:b3:11 (oui Unknown)

我想在每行的两个(':')分隔符后面获取一些特定数量的字符(MAC地址),并将它们保存到字符串中。到目前为止,我有这个:

^{pr2}$

它应该给我所有的子串,我可以进一步处理,以获得MAC地址,但这是一个复杂的方法。有人能指导我如何修复它,或者建议一个更好的方法来完成这个任务吗?在

我也有“DA”和“SA”显示在所有行上,所以如果这是一个更好的主意,我可以尝试使用Regex。在

谢谢你


Tags: 文件方法signalmac地址sa语法mb
3条回答

正则表达式“(DA:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2})”将返回MAC地址“DA:01:23:45:67:89:78”。 你可以为SA做类似的事情。在

一个简单的解决方案:

lst = re.findall('(?:DA|SA|BSSID):(\S+)', line)

\S+表示任何非空白字符。(?:DA|SA|BSSID)是指DASA或{}中的任何一个。在

但是如果你想匹配实际的MAC,那么你可以使用这个:

^{pr2}$

您可以使用this link获得正则表达式的解释。在

对于这两种情况,lst都认为:

['00:00:00:12:34:56', '01:23:45:67:89:78', '89:12:33:45:b3:11']

您应该能够使用以下正则表达式进行匹配:

>>> r = re.compile('.*BSSID:([0-9A-F:]+) .*DA:([0-9A-F:]+) .*SA:([0-9A-F:]+)', re.IGNORECASE)
>>> r.match(s).groups()
('00:00:00:12:34:56', '01:23:45:67:89:78', '89:12:33:45:b3:11')

Regular expression visualization

Run it live

顺便说一句,您也可以使用以下代码段将它们作为字典获取:

^{pr2}$

所以基本上,你可以建立一个dict列表:

datagrams = []
for line in searchfile:
  datagrams.append(r.match(s).groupdict())

然后,例如,获取所有源Mac:

for d in datagrams:
  print d['SA']

相关问题 更多 >