如何将列表元素声明为REGEX

时间:2016-07-08 21:49:00

标签: python

我想在list元素中声明一个正则表达式为r'tata.xnl。* - dev.1.0',它应该匹配tata.xnl.1.0-dev.1.0,如何解决这个问题?

productline = '8.H.5'
pl_component_dict = {'8.H.5': [r'tata.xnl.*-dev.1.0','tan.xnl.1.0-dev.1.0'],
                     '8.H.7':['']
                     }
component_branch = "tata.xnl.1.0-dev.1.0"
if component_branch in pl_component_dict[productline] :
    print "PASS"
else:
    print "ERROR:Gerrit on incorrect component"

错误: -

ERROR:Gerrit on incorrect component

3 个答案:

答案 0 :(得分:0)

使编译的re字典值与您的字符串匹配:

import re

productline = '8.H.5'

pattern = re.compile(r'tata.xnl.\d\.\d-dev.1.0')
pl_component_dict = {'8.H.5': pattern}

component_branch = "tata.xnl.1.0-dev.1.0"

if pl_component_dict[productline].match(component_branch):
    print "PASS"
else:
    print "ERROR:Gerrit on incorrect component"

答案 1 :(得分:0)

r添加到字符串不会使其成为正则表达式 - 它使其成为raw string literal

您需要使用re.compile() 将其编译为正则表达式。

import re
...
for component in pl_component_dict[productline]:
    if re.compile(component).match(component_branch):
        print "PASS"
        break
else: # note that this becomes a for-else, not an if-else clause
    print "ERROR:Gerrit on incorrect component"

这个for-else循环负责处理pl_component_dict[productline]中列表的事件,就像你在这种情况下一样。

答案 2 :(得分:0)

以下是使用re.search的一种方式:

import re

class ReList:
    def __init__(self, thinglist):
        self.list = thinglist
    def contains(self, thing):
        re_list = map( lambda x: re.search( x, thing) , self.list)
        if any( re_list):
            return True
        else:
            return False

my_relist = ReList( ['thing0', 'thing[12]'] )

my_relist.contains( 'thing0')
# True
my_relist.contains( 'thing2')
# True
my_relist.contains( 'thing3')
# False

any语句有效,因为re.search返回布尔值为True的re.MatchObject,否则返回None