Мне нужно извлечь IP-адрес в форме

prosseek.amer.corp.com [10.0.40.147]

Или

prosseek.amer.corp.com (10.0.40.147)

С питоном. Как я могу получить IP для любого случая с Python? Я начал с чего-то вроде

site = "prosseek.amer.corp.com"
m = re.search("%s.*[\(\[](\d+\.\d+\.\d+\.\d+)" % site, r)

Но это не работает.

ADDED

m = re.search("%s.+(\(|\[)(\d+\.\d+\.\d+\.\d+)" % site, r)
m.group(2)
m = re.search(r"%s.*[([](\d+\.\d+\.\d+\.\d+)" % site, r)
m.group(1)

Вроде работает.

3
prosseek 30 Авг 2010 в 20:23

6 ответов

Лучший ответ

Вам не нужно экранировать метасимволы (*, (, ), ., ...) в группах символов (кроме ], если это не первый символ в группе символов; [][]+ будет соответствовать последовательности квадратных скобок.)

Еще один совет, когда дело доходит до Python - использовать строки в стиле r'...'. У них обратный слеш не имеет особого значения. r'\\' напечатает \\, поскольку обратная косая черта не имеет специального значения:

m = re.search(r"%s.*[([](\d+\.\d+\.\d+\.\d+)" % site, r)

В приведенной выше строке это не имеет никакого значения, поскольку \d ничего не значит в Python, но когда дело доходит до таких вещей, как \r, \\ и т. Д., Это облегчает жизнь

3
Blixt 30 Авг 2010 в 16:35
import string    
site='prosseek.amer.corp.com (10.0.40.147)'
''.join([c for c in site if c not in string.ascii_letters+' []()']).strip('.')

Почему-то мне нравится это лучше, чем регулярные выражения

0
Amala 30 Авг 2010 в 20:48

Как насчет того, чтобы просто игнорировать скобки?

site = "prosseek.amer.corp.com"
m = re.search("%s.*(\d+\.\d+\.\d+\.\d+)" % site, r)
0
bramp 30 Авг 2010 в 16:27
re.findall("(?:\d{1,3}\.){3}\d{1,3}", site)
1
killown 31 Авг 2010 в 02:35

Я хотел бы предложить несколько небольших уточнений к тому, что у вас есть:

site = "prosseek.amer.corp.com"
m = re.search(r"%s\s+[([](\d+\.\d+\.\d+\.\d+)" % re.escape(site), r)
m.group(2)

Изменения следующие:

  • Пройдите site через re.escape, чтобы он был интерпретирован буквально; в противном случае точки в имени домена могут совпадать с любым символом. Это особенно важно, если site поступает от пользовательского ввода; Вы не хотите, чтобы кто-то мог вставить туда регулярное выражение и сломать вашу программу.
  • Используйте \s+ вместо .+ между именем сайта и IP-адресом, чтобы он принимал только пробелы.
1
zwol 30 Авг 2010 в 21:04

Использовать

[([]

Символы внутри внешних скобок воспринимаются буквально. Вам не нужно избегать их с обратной косой чертой.

Например:

import re
site = "prosseek.amer.corp.com "
m = re.search("%s\s*[([](\d+\.\d+\.\d+\.\d+)" % site, 'prosseek.amer.corp.com (10.0.40.147)')
1
unutbu 30 Авг 2010 в 16:30