Я пишу python script, и у меня возникла проблема с определенной функцией, она должна открыть файл /etc/resolv.conf, прочитать его по строкам и вернуть только IP-адреса. Хотя он, похоже, находит ip-адрес, он не говорит мне тогда только о том, какая часть памяти есть в какой-либо идее, как заставить его сказать мне соответствующую строку.
Здесь функция:
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>
re.search
возвращает Match Object. Это объект, который имеет несколько атрибутов, которые сообщают вам о совпадении.
Чтобы весь текст совпадал с текстом, используйте 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
all(isinstance(i, int) for i in item.split("."))
улучшить его.
ip
будетNone
а затем, когда вы попытаетесь запустить методgroup()
вы получите исключение, которое будет ловить вашаtry except
. ИМХО было бы предпочтительнее проверить, еслиip
равенNone
.