2010-12-17 5 views
1

syslog를 구문 분석 할 정규식을 작성하려고합니다. 서비스를 사용하는 각 서버를 설명하도록 요청 받았습니다. 나는 FQDN을 꺼내하는 간단한 정규식을 썼다, 그러나 당신이와 findall은 볼 수 있듯이 그것은 ...syslog 서버에서 FQDN을 가져 오는 파이썬 정규식

>>> 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 '] 

라인을 너무 많이 소모 될 것으로 보인다. *이 너무 일반적이며, 정규식 소모 끝 많이.

답변

0

\s\b으로 바꾸고 .*?\S으로 바꿉니다.

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

\ * \ S 예 \ .COM을 작품 너무 –

0

정규식

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

에 [...] 쿼리의 끝을 잡아 것입니다 그리고 당신은 당신에게 단지 도메인 이름을 지정하는 이름이 그룹 룩업을 사용할 수 있습니다.

이것이 필요한 출력이 아니라면 원하는 결과물을 데이터 구조로 정교하게 사용할 수 있습니까? 결과는

subb1.subb2.example.com 
0
#!/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

답장을 보내 주셔서 감사합니다, 나는 \ S에 대해 잊고 ... 그 작품 공간 구분선에 어울립니다. –

0

를 사용해보십시오 포함됩니다

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

:

파이썬 코드는 다음과 같을 수 있습니다.

regex = re.compile("\s\S*?\.example\.com ") 
관련 문제