我尝试使用python浏览文件列表并提取配置块。文件格式如下:
pon-onu-mng gpon-onu_1/2/2:8
ip-host 2 dhcp-enable true ping-response true traceroute-response true
dhcp-ip ethuni eth_0/1 from-internet
dhcp-ip ethuni eth_0/2 from-internet
wifi disable
#
pon-onu-mng gpon-onu_1/2/2:9
ip-host 2 dhcp-enable true ping-response true traceroute-response true
dhcp-ip ethuni eth_0/1 from-internet
dhcp-ip ethuni eth_0/2 from-internet
wifi disable
#
pon-onu-mng gpon-onu_1/2/2:10
ip-host 2 dhcp-enable true ping-response true traceroute-response true
dhcp-ip ethuni eth_0/1 from-internet
dhcp-ip ethuni eth_0/2 from-internet
wifi disable
#
在这些之前和之后还有其他行,但我需要的所有行都以'pon-onu-mng gpon-onu'开始,直到#符号。我需要捕获包括两个“终止符”在内的整个块。
我使用以下正则表达式来查找块:pon-onu-mng.gpon-onu(.*?|[\S\s]?)#我可以将其插入python的re中而不会出现任何错误(这给我带来了问题),但它返回一个空列表。我在www.example.com上测试了该表达式regex101.com,它找到了我需要的所有内容。到目前为止,我的代码如下。有人能帮助我找出我做错了什么吗?
#! /usr/bin/python3
import os
from optparse import OptionParser
import re
import pandas as pd
configFileListRaw = os.system('find . -name startrun.dat > configFileList.txt')
configFileListRaw = open('configFileList.txt').readlines()
os.system('rm configFileList.txt')
pattern = re.compile(r'pon-onu-mng.gpon-onu(.*?|[\S\s]?)#')
#match = re.findall(pattern,"pon-onu-mng gpon-onu")
print(pattern)
for i in configFileListRaw:
file = open (str(i).strip("\n"))
match = re.findall(r'pon-onu-mng.gpon-onu(.*?|[\S\s]?)#',file.read(),re.MULTILINE | re.DOTALL)
print (match)
Regex101:(这里应该有一张图片,但我认为它只是附加了它)
运行脚本的输出。注意-re.compile(第二行)只是我放入的一个print语句,以确保re.compile编译的是我预期的内容。正如你所看到的,我不再使用re.compile,我直接将正则表达式放入re.findall函数:
tymier@FL-ENG026-LT:/mnt/scriptdev/gitlab/zte-phone-parser/2023-04-05-02-00-16/10.57.4.227$ ../../zte_phone_parser.py
re.compile('pon-onu-mng.gpon-onu(.*?|[\\S\\s]?)#')
[]
我试着在谷歌上搜索,直到奶牛回家。我能够弄清楚我需要MULTILINE或DOTALL,也许两者都需要,但老实说不确定。
1条答案
按热度按时间9avjhtql1#
我认为这个问题与我如何阅读文件有关。我重新开始,专注于读取文件并搜索它。我终于能够让以下内容工作: