首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python正则查找器到字典中

Python正则查找器到字典中
EN

Stack Overflow用户
提问于 2019-12-24 22:49:09
回答 4查看 1.4K关注 0票数 0

编程非常新,所以提前为我缺乏知识表示歉意。

在试图推断电话的目录号及其MAC地址的过程中,我在下面提供了一些示例数据,并将其放入LLDPLarge的变量中:

代码语言:javascript
复制
LLDPLarge = '''* Slot-1 Far-B65-2ND.1 # show lldp neighbours detailed | include (System Name: "regDN |: 08:00:0F)

  Port ID     : 08:00:0F:36:46:62
- System Name: "regDN 7335,MITEL 5340 IP"
  Port ID     : 08:00:0F:3E:56:1C
- System Name: "regDN 7383,MITEL 5340 IP"
  Port ID     : 08:00:0F:3C:12:B2
- System Name: "regDN 7270,MITEL 5340 IP"
  Port ID     : 08:00:0F:28:9C:22
- System Name: "regDN 7320,MITEL 5340 IP"'''

我提出的代码如下:

代码语言:javascript
复制
vartest1 = "(?<=System Name: \"regDN )(.*)(?=,)"
vartest2 = "([0-9A-F]{2}[:-]){5}([0-9A-F]{2})"
vartest3 = vartest1 + "|" + vartest2

for match in re.finditer(vartest3, LLDPLarge):
    sGroup = match.group()
    print('{}'.format(sGroup))

这是它创建的输出的一个示例,它非常接近于我想要的结果:

代码语言:javascript
复制
08:00:0F:36:46:62
7335
08:00:0F:3E:56:1C
7383
08:00:0F:3C:12:B2
7270
08:00:0F:28:9C:22
7320

我想做的是将它输出到字典中,如下所示:

代码语言:javascript
复制
'08:00:0F:36:46:62' : '7335'
'08:00:0F:3E:56:1C' : '7383'
'08:00:0F:3C:12:B2' : '7270'
'08:00:0F:28:9C:22' : '7320'

此时,我不知道该如何处理,或者我的代码是否是最优雅的?

任何帮助都是最值得感激的。

在此之前,非常感谢您。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-24 23:02:53

检查是否已填写group(1)group(2)。如果group(1)有一个值,那么regexp匹配电话号码,否则它就匹配MAC地址。然后您可以使用它作为字典的键或值。

代码语言:javascript
复制
d = {}
for match in re.finditer(vartest3, LLDPLarge):
    if match.group(2):
        key = match.group()
    else:
        val = match.group()
        d[key] = val

print(d)
票数 1
EN

Stack Overflow用户

发布于 2019-12-24 23:12:47

代码语言:javascript
复制
from re import finditer
from itertools import islice

# LLDPLarge = ...

pattern_system = "(?<=System Name: \"regDN )(.*)(?=,)"
pattern_port = "([0-9A-F]{2}[:-]){5}([0-9A-F]{2})"
pattern = f"{pattern_system}|{pattern_port}"

d = {key.group(): value.group() for key, value in zip(*[finditer(pattern, LLDPLarge)] * 2)}
票数 1
EN

Stack Overflow用户

发布于 2019-12-24 23:24:40

下面是一个简单的方法:

代码语言:javascript
复制
# Make a list with all the strings
everything = [match.group() for match in re.finditer(vartest3, LLDPLarge)]
# Pick every other one to get a list of just the MAC addresses
macs = everything[0::2]
# Same thing for the names
names = everything[1::2]

# Make a blank dictionary
dict = {}
# Fill the dictionary from our lists
for i in range(0, len(macs)):
    dict[macs[i]] = names[i]

print(repr(dict))

迭代工具解决方案比这更优雅,但这需要更少的python专业知识来理解。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59473957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档