2011-02-04 65 views
0

我试图从一个文件中加载正则表达式模式列表,我希望它将每个正则表达式条目拖入一个数组中,以便以后可以匹配传入的文本模式,然后基于它们触发一个动作。我已经完成了re.search()的工作,但是我怎样才能从文件中加载正则表达式模式,然后用re.search()函数扫描从文件中拉出的各种正则表达式模式,论据?Python:将数据从文件加载到IRC bot中

+0

你可能会看看一些已经存在的IRC机器人。例如[pmxbot](https://bitbucket.org/yougov/pmxbot/src)可以让您轻松查看某些字符串并采取适当的行动。 – chmullig 2011-02-04 16:11:13

+0

我正在尝试为特定的IRC bot框架创建一个模块,因此我需要对此进行简要的了解。 – 2011-02-04 20:17:03

回答

2

如果要在正则表达式的文本模式匹配来触发一个动作,你可能需要正则表达式的一些映射到行动(让我们假设它是在同一个文件中定义的映射函数的引用)。说我们在Python文件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) 

当然,这取决于您想要如何触发该操作,但我希望主要原则很明确。

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