Регулярное выражение Python для извлечения полного доменного имени с сервера системного журнала

Я пытаюсь создать регулярное выражение для анализа наших системных журналов. Меня попросили вести учет для каждого сервера, который использует сервис. Я написал простое регулярное выражение для извлечения полного доменного имени, но, похоже, оно занимает слишком много строки...

>>> string = "2010-12-13T00:00:02-05:00 <local3.info> suba1.suba2.example.com named[29959]: client 192.168.11.53#54608: query: subb1.subb2.example.com"
>>> regex = re.compile("\s.*?\.example\.com ")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x896dae0bbf9e6bf0>

# Run findall
>>> regex.findall(string)
[u' <local3.info> suba1.suba2.example.com ', u' client 192.168.11.53#54608: query: subb1.subb2.example.com ']

Как вы можете видеть, findall с .* слишком общий, и регулярное выражение в конечном итоге потребляет слишком много.


person Community    schedule 17.12.2010    source источник


Ответы (4)


Замена \s на \b и .*? на \S сделает это.

>>> regex = re.compile(r'\b\S*\.example\.com')
>>> regex.findall(string)
[u'suba1.suba2.example.com', u'subb1.subb2.example.com']
person nmichaels    schedule 17.12.2010

Регулярное выражение

r"query: ([\w\.]+)"

будет захватывать конец [...] запроса, а затем вы можете использовать поиск безымянной группы, чтобы дать вам только доменное имя.

Если это не тот результат, который вам нужен, можете ли вы уточнить желаемый результат (как структуру данных. Я сделал предположение об этом).

Код Python может выглядеть так:

match = re.search(r"query: ([\w.]+)", string, re.IGNORECASE | re.MULTILINE)
if match:
    result = match.group(1)
else:
    result = ""

результат будет содержать

subb1.subb2.example.com
person Frank V    schedule 17.12.2010

Попробуйте использовать:

regex = re.compile("\s\S*?\.example\.com ")
person Rod    schedule 17.12.2010

person    schedule
comment
Спасибо за ваш ответ, я забыл о \S ... Это идеально подходит для строк с разделителями-пробелами. - person ; 17.12.2010