搜索文本并保存为字符串,python
由于Linux中的ifconfig命令,我只想将int addr和Mask保留在两个字符串中:搜索文本并保存为字符串,python,python,search,Python,Search,由于Linux中的ifconfig命令,我只想将int addr和Mask保留在两个字符串中: eth0 Link encap:Ethernet HWaddr 22:33:0a:e9:15:76 inet addr:10.244.21.118 Bcast:10.244.21.127 Mask:255.244.255.192 inet6 addr: fe80::0050:aff:fee9:1576/64 Scope:Link
eth0 Link encap:Ethernet HWaddr 22:33:0a:e9:15:76
inet addr:10.244.21.118 Bcast:10.244.21.127 Mask:255.244.255.192
inet6 addr: fe80::0050:aff:fee9:1576/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:807304 errors:0 dropped:0 overruns:0 frame:0
TX packets:611741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:253087331 (241.3 MiB) TX bytes:167902811 (160.1 MiB)
要最终实现这一点:
inet_addr: "10.244.21.118"
mask="255.244.255.192"
有没有更快的办法?我唯一的想法是解析每一行,然后搜索int addr并删除名称。。。但是我不知道它是否有效。使用,您可以完成这项任务。下面的代码将所有内容放在设备
列表中,但for
循环除外
import re
ifconfig = """eth0 Link encap:Ethernet HWaddr 22:33:0a:e9:15:76
inet addr:10.244.21.118 Bcast:10.244.21.127 Mask:255.244.255.192
inet6 addr: fe80::0050:aff:fee9:1576/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:807304 errors:0 dropped:0 overruns:0 frame:0
TX packets:611741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:253087331 (241.3 MiB) TX bytes:167902811 (160.1 MiB)
"""
devices = []
for d in re.findall(r'^(\S+).*?inet addr:(\S+).*?Mask:(\S+)', ifconfig, re.S | re.M):
devices.append((d[0], d[1], d[2]))
print devices
产出:
[('eth0', '10.244.21.118', '255.244.255.192')]
最后,只需稍加修改,就可以在运行ifconfig
时显示的每个设备上执行此循环。在re.findall
循环之前,您还需要一个for
循环,以便按设备拆分它。我相信类似ifconfig.split('\n\n')中dev的:
可以按设备正确地对其进行拆分。使用,您可以实现这一点。下面的代码将所有内容放在设备
列表中,但for
循环除外
import re
ifconfig = """eth0 Link encap:Ethernet HWaddr 22:33:0a:e9:15:76
inet addr:10.244.21.118 Bcast:10.244.21.127 Mask:255.244.255.192
inet6 addr: fe80::0050:aff:fee9:1576/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:807304 errors:0 dropped:0 overruns:0 frame:0
TX packets:611741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:253087331 (241.3 MiB) TX bytes:167902811 (160.1 MiB)
"""
devices = []
for d in re.findall(r'^(\S+).*?inet addr:(\S+).*?Mask:(\S+)', ifconfig, re.S | re.M):
devices.append((d[0], d[1], d[2]))
print devices
产出:
[('eth0', '10.244.21.118', '255.244.255.192')]
最后,只需稍加修改,就可以在运行ifconfig
时显示的每个设备上执行此循环。在re.findall
循环之前,您还需要一个for
循环,以便按设备拆分它。我相信类似ifconfig.split('\n\n')中dev的:
可以按设备正确地进行拆分。可能是这样的吗
#!/usr/local/cpython-3.3/bin/python
import re
def give_string():
string = '''
eth0 Link encap:Ethernet HWaddr 22:33:0a:e9:15:76
inet addr:10.244.21.118 Bcast:10.244.21.127 Mask:255.244.255.192
inet6 addr: fe80::0050:aff:fee9:1576/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:807304 errors:0 dropped:0 overruns:0 frame:0
TX packets:611741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:253087331 (241.3 MiB) TX bytes:167902811 (160.1 MiB)
'''
return string
def main():
string = give_string()
regex = re.compile('^.*inet addr:\s*(\d+\.\d+\.\d+\.\d+) .*Mask:\s*(\d+\.\d+\.\d+\.\d+).*$', re.MULTILINE | re.DOTALL)
match = regex.match(string)
ip_address = match.group(1)
subnet_mask=match.group(2)
print(ip_address, subnet_mask)
main()
顺便说一句,我通常说人们过度使用正则表达式,但这是一个很好的例子。也许是这样
#!/usr/local/cpython-3.3/bin/python
import re
def give_string():
string = '''
eth0 Link encap:Ethernet HWaddr 22:33:0a:e9:15:76
inet addr:10.244.21.118 Bcast:10.244.21.127 Mask:255.244.255.192
inet6 addr: fe80::0050:aff:fee9:1576/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:807304 errors:0 dropped:0 overruns:0 frame:0
TX packets:611741 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:253087331 (241.3 MiB) TX bytes:167902811 (160.1 MiB)
'''
return string
def main():
string = give_string()
regex = re.compile('^.*inet addr:\s*(\d+\.\d+\.\d+\.\d+) .*Mask:\s*(\d+\.\d+\.\d+\.\d+).*$', re.MULTILINE | re.DOTALL)
match = regex.match(string)
ip_address = match.group(1)
subnet_mask=match.group(2)
print(ip_address, subnet_mask)
main()
顺便说一句,我通常说人们过度使用正则表达式,但这是一个很好的例子。因为ifconfig的输出是可预测的,所以实际上并不需要正则表达式。此代码捕获输出并使用常用的python字符串工具进行解析:
from subprocess import check_output
lines = check_output(["/sbin/ifconfig", "eth0"]).split('\n')
line = lines[1] # Get the 2nd line
parts = line.split()
inet_addr = parts[2]
mask = parts[-1].split(':')[1]
print 'inet_addr=%s mask=%s' % (inet_addr, mask)
由于ifconfig的输出是可预测的,所以实际上并不需要正则表达式。此代码捕获输出并使用常用的python字符串工具进行解析:
from subprocess import check_output
lines = check_output(["/sbin/ifconfig", "eth0"]).split('\n')
line = lines[1] # Get the 2nd line
parts = line.split()
inet_addr = parts[2]
mask = parts[-1].split(':')[1]
print 'inet_addr=%s mask=%s' % (inet_addr, mask)
python中的3个常规选项:
- 从对
的shell调用中解析它。您当前的方法,以及所有其他答案的方法ifconfig
- 使用插座。设置UDP套接字以连接到外部主机,查看其sockname并找到其掩码。您将不得不处理一些(非常)低级的API
- 使用外部模块。e、 g
import socket
import fcntl
import struct
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDP
s.connect(('google.com',0)) #prepare UDP socket to connect to some external host
s.getsockname()
Out[17]: ('10.0.2.15', 56965)
socket.inet_ntoa(fcntl.ioctl(s, 0x891b, struct.pack('256s', 'eth0'))[20:24])
Out[18]: '255.255.255.0'
要归功于掩码解决方案的回答者,我不知道我头脑中的那些操作码:)3 python中的常规选项:
- 从对
的shell调用中解析它。您当前的方法,以及所有其他答案的方法ifconfig
- 使用插座。设置UDP套接字以连接到外部主机,查看其sockname并找到其掩码。您将不得不处理一些(非常)低级的API
- 使用外部模块。e、 g
import socket
import fcntl
import struct
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDP
s.connect(('google.com',0)) #prepare UDP socket to connect to some external host
s.getsockname()
Out[17]: ('10.0.2.15', 56965)
socket.inet_ntoa(fcntl.ioctl(s, 0x891b, struct.pack('256s', 'eth0'))[20:24])
Out[18]: '255.255.255.0'
要归功于面具解决方案的负责人,我不知道我头顶上的那些操作码:)