Регулярное выражение Python для извлечения FQDN с сервера системного журнала - PullRequest
1 голос
/ 17 декабря 2010

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

>>> 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 с. * Слишком общий, и регулярное выражение в конечном итоге потребляет много.

Ответы [ 4 ]

0 голосов
/ 17 декабря 2010

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

regex = re.compile("\s\S*?\.example\.com ")
0 голосов
/ 17 декабря 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
0 голосов
/ 17 декабря 2010
#!/usr/bin/env python

import re

s = """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"""

pattern = re.compile("[\S.]+.example.com")

print pattern.findall(s)
# => ['suba1.suba2.example.com', 'subb1.subb2.example.com']
0 голосов
/ 17 декабря 2010

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

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