初学 Python ,求大佬指导个 Python 思路

2017-10-11 11:58:12 +08:00
 itsjoke

有以下文本,大多数情况下都是第一段文本,偶尔会有第二段,相比第一个多了一个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? 谢谢!

3003 次点击
所在节点    Python
11 条回复
yunkchen
2017-10-11 13:10:17 +08:00
re.findall(r"\d+\.\d+\.\d+\.\d+", vlan_info)
superhan
2017-10-11 13:42:20 +08:00
正确的思路是找一个库
itsjoke
2017-10-11 13:42:51 +08:00
我是想分别取得网段的值,所以没有用 findall
一时半会儿没想到应该怎么写了
前来求助
glongzh
2017-10-11 13:48:01 +08:00
多查手册,re.search 只会返回第一个 Match
itsjoke
2017-10-11 14:00:29 +08:00
@glongzh 这个我知道是只会返回第一个 Match
我想的是毕竟第二段这种情况较少,难道也只能单独再写一个来匹配吗?
或者说有什么其他的 pythonic 的方法来实现呢?
julyclyde
2017-10-11 14:18:24 +08:00
网络设备的这种配置,其实不适合用这种方法来解析
itsjoke
2017-10-11 14:25:19 +08:00
@julyclyde 应该怎么弄呢?麻烦有空指导下了,多谢。
ferstar
2017-10-11 17:08:27 +08:00
你这个需求不需要用正则的
```python
import sys


def main(fp):
print('ip\tmask')
with open(fp, 'r') as fh:
for line in fh:
line_trim = line.strip()
if line_trim.startswith('ip address'):
lst = line_trim.split()
ip, mask = lst[2], lst[3]
print('{}\t{}'.format(ip, mask))


if __name__ == '__main__':
if len(sys.argv) != 2:
print("usage: {} <ip_file>".format(sys.argv[0]))
sys.exit(1)
main(sys.argv[1])

```
ferstar
2017-10-11 17:13:02 +08:00
@ferstar 我去, v2 的回复真是无力吐槽, 代码见 gist: https://gist.github.com/ferstar/fb9156300827f6eb18aa5e219970cfec
Glink
2017-10-11 21:27:47 +08:00
cat file |grep 'ip address'|awk -F ' ' '{print $3" "$4}'
一句 shell 能解决的问题,非要写 python
itsjoke
2017-10-12 09:13:00 +08:00
@Glink [dog]我这个又并不是解决单个问题,我这个是在 python 下面的一段问题而已。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396718

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX