Python新手求大佬指导:如何构建Python编程思路?

有以下文本,大多数情况下都是第一段文本,偶尔会有第二段,相比第一个多了一个ip address x.x.x.x x.x.x.x

4500#sh run int vlan 3
Building configuration...

Current configuration : 122 bytes ! interface Vlan3 ip address 192.168.234.17 255.255.255.240 no ip redirects no ip proxy-arp end

4500#sh run int vlan 4
Building configuration...

Current configuration : 192 bytes
!
interface Vlan4
 ip address 192.168.23.65 255.255.255.192 secondary
 ip address 192.168.4.1 255.255.255.0
 ip access-group 100 in
 no ip redirects
 no ip unreachables
 no ip proxy-arp
end

我用这段正则来匹配:

vlan_info = vlan_output.encode('ascii','ignore')
vlan_info_re = re.search(r"(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b) (\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)",vlan_info)
gateway = vlan_info_re.group(1)
netmask = vlan_info_re.group(2)

如果仅是第一段文本的话是可以正常匹配的,但如果第二段也存在的话就只会匹配到第一个。 求大佬指导个 python 的思路,怎么把文本里面的 ip 和掩码全取出来,应该怎么写才比较 pythonic? 谢谢!


Python新手求大佬指导:如何构建Python编程思路?

12 回复

re.findall(r"\d+.\d+.\d+.\d+", vlan_info)


帖子我看了,你问的“编程思路”其实是新手最该搞明白的。这东西说白了,就是“怎么把一个现实问题,变成电脑能懂的步骤”。

别想得太玄乎,我给你拆成三步走,照着练就行:

第一步:把问题说人话,拆成小任务 别一上来就敲代码。先拿张纸,用大白话把你要干嘛写清楚。比如“统计一个文件里每个单词出现了几次”,你可以拆成:

  1. 让程序找到并打开那个文件。
  2. 把文件里所有内容读出来。
  3. 把一整段文字拆成一个一个的单词。
  4. 准备一个“笔记本”(比如字典),用来记每个单词和它出现的次数。
  5. 遍历所有单词,每遇到一个,就在“笔记本”上给这个单词的计数加1。
  6. 把“笔记本”上记录的结果打印出来。

第二步:把每个小任务“翻译”成代码 现在,对着你列的小任务,去找Python里能完成这个任务的“工具”(语句、函数)。这一步需要你熟悉Python的基本操作。

  • 任务1和2:用 with open('file.txt', 'r') as f: text = f.read()
  • 任务3:用 words = text.split()
  • 任务4:用 word_count = {}
  • 任务5:用一个 for 循环遍历 words,里面用 word_count[word] = word_count.get(word, 0) + 1 来计数。
  • 任务6:用 print(word_count)

第三步:把代码块组装起来,运行调试 把第二步找到的代码块,按第一步的逻辑顺序拼在一起,就得到了一个完整的程序。运行它,看看结果对不对。不对就回头检查是“翻译”错了,还是逻辑没拆对。

一个完整的例子: 我们就用上面说的统计词频来演示。

# 1. 打开文件,读取全部内容
with open('your_file.txt', 'r') as file:
    text = file.read()

# 2. 把文本分割成单词列表
words = text.split()

# 3. 初始化一个字典来存结果
word_count = {}

# 4. 遍历每个单词进行统计
for word in words:
    # 如果单词已经在字典里,次数+1;如果不在,设置初始值为0再加1
    word_count[word] = word_count.get(word, 0) + 1

# 5. 打印结果
print(word_count)

怎么练?

  1. 从小开始:先写几十行能解决具体小问题的脚本,比如整理桌面文件、算算零花钱。
  2. 多读别人的代码:去GitHub上找些小项目,别看框架,就看人家解决一个具体函数是怎么想的。
  3. 动手改:拿到一段能运行的代码,试着改点需求。比如上面例子,改成“只统计长度大于3的单词”,你就得在循环里加个 if len(word) > 3 的判断。这就是在训练你调整思路。

总结:先理清步骤再写代码,别反过来。

这过程一开始会慢,但练多了就会形成本能。核心就是 “分解-翻译-组装” ,没别的窍门。

正确的思路是找一个库

我是想分别取得网段的值,所以没有用 findall
一时半会儿没想到应该怎么写了
前来求助

多查手册,re.search 只会返回第一个 Match

这个我知道是只会返回第一个 Match
我想的是毕竟第二段这种情况较少,难道也只能单独再写一个来匹配吗?
或者说有什么其他的 pythonic 的方法来实现呢?

网络设备的这种配置,其实不适合用这种方法来解析

应该怎么弄呢?麻烦有空指导下了,多谢。

你这个需求不需要用正则的
python<br>import sys<br><br><br>def main(fp):<br> print('ip\tmask')<br> with open(fp, 'r') as fh:<br> for line in fh:<br> line_trim = line.strip()<br> if line_trim.startswith('ip address'):<br> lst = line_trim.split()<br> ip, mask = lst[2], lst[3]<br> print('{}\t{}'.format(ip, mask))<br><br><br>if __name__ == '__main__':<br> if len(sys.argv) != 2:<br> print("usage: {} &lt;ip_file&gt;".format(sys.argv[0]))<br> sys.exit(1)<br> main(sys.argv[1])<br><br>

我去, v2 的回复真是无力吐槽, 代码见 gist: https://gist.github.com/ferstar/fb9156300827f6eb18aa5e219970cfec

cat file |grep ‘ip address’|awk -F ’ ’ '{print $3" "$4}'
一句 shell 能解决的问题,非要写 python

[dog]我这个又并不是解决单个问题,我这个是在 python 下面的一段问题而已。。。。

回到顶部