Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索文本并保存为字符串,python_Python_Search - Fatal编程技术网

搜索文本并保存为字符串,python

搜索文本并保存为字符串,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

由于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
          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个常规选项:

  • 从对
    ifconfig
    的shell调用中解析它。您当前的方法,以及所有其他答案的方法
  • 使用插座。设置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中的常规选项:

  • 从对
    ifconfig
    的shell调用中解析它。您当前的方法,以及所有其他答案的方法
  • 使用插座。设置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'
要归功于面具解决方案的负责人,我不知道我头顶上的那些操作码:)