Python正则表达式读取/etc/resolv.conf并仅返回ip地址,认为它就快到了,
我一直在写一个python脚本,但我对某个函数有一个问题,它应该打开/etc/resolv.conf文件,逐行读取,然后只返回ip地址。虽然它看起来是在查找ip地址,但它并没有告诉我内存的哪一部分,也没有告诉我如何让它告诉我匹配的字符串本身 下面是函数:Python正则表达式读取/etc/resolv.conf并仅返回ip地址,认为它就快到了,,python,regex,linux,ip,Python,Regex,Linux,Ip,我一直在写一个python脚本,但我对某个函数有一个问题,它应该打开/etc/resolv.conf文件,逐行读取,然后只返回ip地址。虽然它看起来是在查找ip地址,但它并没有告诉我内存的哪一部分,也没有告诉我如何让它告诉我匹配的字符串本身 下面是函数: def get_resolv(): nameservers=[] rconf = open("/etc/resolv.conf","r") line = rconf.readline() while line:
def get_resolv():
nameservers=[]
rconf = open("/etc/resolv.conf","r")
line = rconf.readline()
while line:
try:
ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line)
except:
ip = "none set"
print ip
nameservers.append(ip)
line= rconf.readline()
return nameservers
以下是调用时的输出:
None
<_sre.SRE_Match object at 0xb76964b8>
<_sre.SRE_Match object at 0xb7696db0>
无
重新搜索将返回一个。这是一个具有多个属性的对象,这些属性告诉您有关匹配的信息
要获得完整的匹配文本,请使用ip.group(0)
或ip.group()
另外,re.search
如果没有匹配项,则不会引发异常,而是返回None
。因此,您的代码应该如下所示:
ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line)
if ip is None:
ip = "none set"
re.search
正在返回一个。这是一个具有多个属性的对象,这些属性告诉您有关匹配的信息
要获得完整的匹配文本,请使用ip.group(0)
或ip.group()
另外,re.search
如果没有匹配项,则不会引发异常,而是返回None
。因此,您的代码应该如下所示:
ip = re.search(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b",line)
if ip is None:
ip = "none set"
另一种方式
>>> data=open("/etc/resolv.conf").read().split()
>>> for item in data:
... if len( item.split(".") ) == 4:
... print item
...
192.168.0.1
另一种方式
>>> data=open("/etc/resolv.conf").read().split()
>>> for item in data:
... if len( item.split(".") ) == 4:
... print item
...
192.168.0.1
是的,将行更改为这个ip=re.search(r“\b(?[0-9]{1,3}\){3}[0-9]{1,3}\b”,行)。group()现在工作得很好,非常感谢@Shutupsquare-这是可行的,但可能并不理想。当您没有匹配的
ip
时,将是None
,然后当您尝试运行group()
方法时,您将得到一个异常,您的try except
将捕获该异常。我想最好检查一下ip
是否为None
。是的,p将行更改为这个ip=re.search(r“\b(?[0-9]{1,3}\){3}[0-9]{1,3}\b”,line)。group()现在工作得很好,非常感谢@Shutupsquare-这是可行的,但可能并不理想。当您没有匹配的ip
时,将是None
,然后当您尝试运行group()
方法时,您将得到一个异常,您的try except
将捕获该异常。我想最好检查一下ip
是否为None
。只需检查一下,它也能完美地满足我的要求。非常感谢你,这比公认的答案更好,因为它更像是一种Pythonic“duck typing”方法,而且没有regex。如果字符串看起来像IP,那么它就是IP。只需对item.split(“.”)中的i进行一个额外的测试all(i实例(i,int))
就可以改进它。只需检查一下这个,它也可以完美地满足我的要求。非常感谢,这比公认的答案更好,因为它更像是一种Pythonic“duck typing”方法,并且没有正则表达式。如果字符串看起来像IP,那么它就是IP。只有对item.split(“.”)中的i进行额外的测试all(isinstance(i,int))才能改进它。