2011-02-04 3 views
0

파일에서 정규식 패턴 목록을로드하려고하는데 각 정규식 항목을 나중에 일치시킬 수있는 배열로 가져오고 싶습니다. 들어오는 텍스트 패턴을 기반으로 액션을 트리거합니다.Python : 파일에서 IRC 봇으로 데이터로드

re.search() 작업을 이미 만들었지 만 파일에서 정규식 패턴을로드 한 다음 re.search()를 사용하여 파일에서 가져온 다양한 정규식 패턴을 스캔 할 수 있습니까? 논의? 당신이 정규식은 텍스트 패턴과 일치 할 때 작업을 트리거 할 경우

+0

이미 존재하는 일부 IRC 봇을 살펴볼 수 있습니다. 예를 들어, [pmxbot] (https://bitbucket.org/yougov/pmxbot/src)을 사용하면 특정 문자열을보고 적절하게 작동 할 수 있습니다. – chmullig

+0

특정 IRC 봇 프레임 워크 용 모듈을 만들려고하는데, 이에 대한 간단한 이해가 필요합니다. –

답변

2

, 당신은 아마 작업에 정규 표현식의 일부 매핑이 필요합니다 (의 그것을 매핑과 같은 파일에 정의 된 함수에 대한 참조입니다 가정하자). 우리는이 같은 파이썬 파일 rules.py의 규칙을 정의하는 말 :에

mappings = [ 
    # (regex, action_name) 
    (r'Hi ([a-z]+)!', greet), 
    (r'Bye', bye), 
] 

def greet(msg): 
    return 'Hello' 

def bye(msg): 
    return 'Bye' 

당신의 main.py 당신은 (그들에게 모든 검색을 재 컴파일 방지하기 위해 한 번 작업) 모든 정규식 표현 컴파일하고 다음 검색에 대한 작업을 수행 매핑을 가져 들어오는 메시지.

import rules 

# compile regex 
compiled = dict([(re.compile(regex), action_name) for (regex, action_name) in rules.mappings]) 

def incoming(msg): 
    for regex, action_name in compiled: 
     if regex.search(msg): 
      # if search is successfull, execute action 
      action_function = getattr(rules, action_name) 
      action(msg) 

은 물론 당신이 그 동작을 트리거하는 방법에 따라 달라집니다,하지만 난 주요 원칙은 분명하다 바랍니다.

+0

텍스트 파일에서로드하려고 할 때 코드를 수정하여 어떻게 수정합니까? –

+0

감사합니다. 매우 도움이되었습니다. :) –

1
# pre-compile regexes: 
with open('regex_file.txt') as f: 
    regexes = [re.compile(regex.strip()) for regex in f] 

# use them 
for regex in regexes: 
    m = regex.search(text) 
    if m: 
     print 'got match!!'