首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用正则表达式修改TXT中的行的问题

用正则表达式修改TXT中的行的问题
EN

Stack Overflow用户
提问于 2022-10-31 18:13:06
回答 2查看 38关注 0票数 0

我在“发展”一个清理TXT行的脚本方面遇到了问题,附带的TXT示例如下:

代码语言:javascript
复制
Fri Oct 14 22:27:49.100 EDT

Interface          Status      Protocol    Description
--------------------------------------------------------------------------------
Lo0                up          up          Loopback0 interface configured by Netmiko
Lo55               up          up          
Lo100              up          up          ***MERGE LOOPBACK 100****
Lo111              up          up          Configured by NETCONF
Nu0                up          up          
Mg0/RP0/CPU0/0     up          up          DO NOT TOUCH THIS !
Gi0/0/0/0          admin-down  admin-down  ANSIBLE NXOS TEST
Gi0/0/0/1          admin-down  admin-down  test
Gi0/0/0/1.100      admin-down  admin-down  
Gi0/0/0/2          admin-down  admin-down  Link to P2 configured by Netmiko
Gi0/0/0/3          up          up          Configured by Ansible !!!!!!!!
Gi0/0/0/4          up          up          Updated by Ansible using Jinja Template
Gi0/0/0/5          up          up          Configured by Ansible !!!!!!
Gi0/0/0/6          admin-down  admin-down  Updated by Ansible using Jinja Template
Gi0/0/0/6.11       admin-down  admin-down
Lo20               admin-down  admin-down  
Lo22               up          up          Loopback para pruebas
[K --More--           [KLo69               admin-down  admin-down  
Gi0/3/3/4          up          up          A SDH 
Gi0/3/3/4.852      up          up          TMU a Red BIT
[K --More--           [KGi0/3/3/4.853      up          up          Configured by Ansible !!!!!!
Gi0/3/4/2.256      up          up          Frontera Cliente A
Gi0/3/4/2.257      up          up          Frontera Cliente B
[K --More--           [KGi0/3/4/2.261      up          up          Frontera Cliente C
Te0/7/0/3          admin-down  admin-down  
Mg0/RP0/CPU0/0     down        down        
Mg0/RP1/CPU0/0     admin-down  admin-down  
[KRP/0/RP0/CPU0:ROUTER1# 

剧本如下:

代码语言:javascript
复制
list_txt = [ruta/"prueba.txt"]

for txt in list_txt:

  with open(txt, "r") as f:

    lines = f.readlines()

  with open(txt, "w") as fw:
    for line in lines:

      if not re.match("-{5}|\s+|([A-Za-z0-9]+( [A-Za-z0-9]+)+)", line):
        fw.write(line)

有了这个脚本,我可以删除所有上面日期的行、空行和它们是纯连字符的行,问题是我试图添加两样东西:

1-在regex中添加,如果其中包含"CPU“一词,则行将被删除:

代码语言:javascript
复制
Mg0/RP0/CPU0/0     down        down        
Mg0/RP1/CPU0/0     admin-down  admin-down  
[KRP/0/RP0/CPU0:ROUTER1#   

2.另一方面,我需要删除一些行中添加的奇怪的内容,例如:

代码语言:javascript
复制
[K --More--           [KLo69               admin-down  admin-down

让它像这样干净:

代码语言:javascript
复制
Lo69               admin-down  admin-down

最后一个我尝试通过txt.lstrip("[K")来实现它,但是没有效果,我做的不对,它不工作,Regex我也没有按键,我也不能添加CPU这个词,我不太清楚如何生成Regex。

理想情况下,我希望你能把所有的东西都添加到现有的脚本中,这样就不会让事情变得那么复杂,你能帮我一下吗?

EN

回答 2

Stack Overflow用户

发布于 2022-10-31 20:00:40

我认为正则表达式在这里并没有什么区别,只是可能解析标题,这样您就可以知道某一列的数据将从哪个索引开始:

代码语言:javascript
复制
spans = []
result = []
with open(txt, "r") as f:
    it = iter(f.readlines())    
    # Skip lines until headings are found
    for line in it:
        if "  " in line:
            break
    # Get start/end indices of each column
    spans = [
         m.span()
         for m in re.finditer(r"\S+\s*", line)
    ]
    spans[-1] = (spans[-1][0], -1)
    next(it) # Skip line with just hyphens
    # Iterate the real data part of the input
    for line in it:
        if line.startswith("[K --More--"):
            # Get content part of this line
            line = line[line.index("[K", 10) + 2:]
        elif line.startswith("[K") or "/CPU" in line:
            continue  # Not interested
        result.append(tuple(line[start:end].rstrip() for start, end in spans))

# Output what was collected:
for record in result:
    print(record)

给定示例文件的输出是:

代码语言:javascript
复制
('Lo0', 'up', 'up', 'Loopback0 interface configured by Netmiko')
('Lo55', 'up', 'up', '')
('Lo100', 'up', 'up', '***MERGE LOOPBACK 100****')
('Lo111', 'up', 'up', 'Configured by NETCONF')
('Nu0', 'up', 'up', '')
('Gi0/0/0/0', 'admin-down', 'admin-down', 'ANSIBLE NXOS TEST')
('Gi0/0/0/1', 'admin-down', 'admin-down', 'test')
('Gi0/0/0/1.100', 'admin-down', 'admin-down', '')
('Gi0/0/0/2', 'admin-down', 'admin-down', 'Link to P2 configured by Netmiko')
('Gi0/0/0/3', 'up', 'up', 'Configured by Ansible !!!!!!!!')
('Gi0/0/0/4', 'up', 'up', 'Updated by Ansible using Jinja Template')
('Gi0/0/0/5', 'up', 'up', 'Configured by Ansible !!!!!!')
('Gi0/0/0/6', 'admin-down', 'admin-down', 'Updated by Ansible using Jinja Template')
('Gi0/0/0/6.11', 'admin-down', 'admin-down', '')
('Lo20', 'admin-down', 'admin-down', '')
('Lo22', 'up', 'up', 'Loopback para pruebas')
('Lo69', 'admin-down', 'admin-down', '')
('Gi0/3/3/4', 'up', 'up', 'A SDH')
('Gi0/3/3/4.852', 'up', 'up', 'TMU a Red BIT')
('Gi0/3/3/4.853', 'up', 'up', 'Configured by Ansible !!!!!!')
('Gi0/3/4/2.256', 'up', 'up', 'Frontera Cliente A')
('Gi0/3/4/2.257', 'up', 'up', 'Frontera Cliente B')
('Gi0/3/4/2.261', 'up', 'up', 'Frontera Cliente C')
('Te0/7/0/3', 'admin-down', 'admin-down', '')

我可能错过了您的一些需求,但我认为使用这种方法很容易适应。

票数 1
EN

Stack Overflow用户

发布于 2022-11-01 22:43:19

我补充了我能够以尽可能简化的方式给出的最后解决办法:

代码语言:javascript
复制
for txt in list_txt:

  with open(txt, "r") as f:

    lines = f.readlines()

  with open(txt, "w") as fw:
    for line in lines:

      if re.match("-{5}|\s+|([A-Za-z0-9]+( [A-Za-z0-9]+)+)", line) or re.search("CPU", line):
        pass
      elif "[K" in line:
        line2 = line.rindex("[K")
        line3 = line[line2+2:]
        fw.write(line3)
      else:
        fw.write(line)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74267519

复制
相关文章

相似问题

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