如何在Python中动态生成此代码?

时间:2015-08-12 11:03:32

标签: python regex

我有一大堆数据和另一个模式列表。我试图使用模式过滤数据。这是我使用一些示例数据的代码:

dataList = [ '4334 marked val 5656 bin', 
    '76-67-34 done this 99', 
    'bin ket AZZ3R434 pid' 
]

for data in dataList:
    regexList = [ re.search(r'val ([\d]+) bin', data),
            re.search(r'bin ket ([A-Z\d-]+)\b', data)
        ]

    for reg in regexList:
        if reg:                   #If there's a match
            #...do something...
            break

regexlist 中的上述代码中,' re.search()'部分是一次又一次地重复。我想只保留一个模式列表,如下所示:

regexList = [ 'val ([\d]+) bin',
        'bin ket ([A-Z\d-]+)\b'
    ]

稍后使用re.search()逐个使用这些模式。我尝试使用eval()和exec()两者,但只是不断出错。

我还想知道' regexList'是在for循环中一次又一次地创建?

3 个答案:

答案 0 :(得分:2)

我不明白为什么你需要用eval / exec来做这件事。只需将模式传递给循环内的re.search:

regexList = [
    r'val ([\d]+) bin',
    r'bin ket ([A-Z\d-]+)\b'
]
for pattern in regexList:
    if re.search(pattern, data):
        ...

答案 1 :(得分:1)

dataList = [ '4334 marked val 5656 bin', 
    '76-67-34 done this 99', 
    'bin ket AZZ3R434 pid' 
]

regexList = [
         r'val ([\d]+) bin',
         r'bin ket ([A-Z\d-]+'
]
for data in dataList:
    for reg in regexList:
        if  re.search(reg,data):                   #If there's a match
            #...do something...
            break

答案 2 :(得分:-1)

我建议使用"路由器" (例如Dromeo,我是作者),重点是路由器匹配模式并在模式匹配时执行操作,因此这正是您所需要的。

示例:

import Dromeo

router = Dromeo()

router.on('4334 marked val {%INT%:val} bin', my_handler)

router.route('4334 marked val 5656 bin')

def my_handler( params ):
   # val is already typecasted to integer
   print(params['data']['val'])