Python regex читает /etc/resolv.conf и возвращает только ip адрес, думаю, что его почти нет,

1

Я пишу 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>
Теги:
ip

2 ответа

2
Лучший ответ

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"
  • 0
    да изменил строку на этот ip = re.search (r "\ b (?: [0-9] {1,3} \.) {3} [0-9] {1,3} \ b", строка) .group () и теперь отлично работает, большое спасибо !!!
  • 0
    @Shutupsquare - это работает, но, возможно, не идеально. Если у вас нет совпадения, ip будет None а затем, когда вы попытаетесь запустить метод group() вы получите исключение, которое будет ловить ваша try except . ИМХО было бы предпочтительнее проверить, если ip равен None .
2

Другой способ

>>> data=open("/etc/resolv.conf").read().split()
>>> for item in data:
...     if len( item.split(".") ) == 4:
...          print item
...
192.168.0.1
  • 0
    только что проверил, и это также отлично работает для того, что я хочу, большое спасибо
  • 0
    Мне нравится этот ответ лучше, чем принятый ответ, потому что это скорее питонский подход "типизирование утки" и без регулярных выражений. Если строка выглядит как IP, то это IP. Только дополнительный тест all(isinstance(i, int) for i in item.split(".")) улучшить его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню