在python中构建一个冗长的正则表达式

时间:2013-05-15 08:03:12

标签: python regex

我正在尝试构建一个依赖于来自许多不同来源的变量的正则表达式。

来源:

dict1 = {"a":"somevalue","b":"somevalue","c":"somevalue"}
source2 = "x"
source3 = "_1"

我想构建一个正则表达式,它取决于我将从上述来源获得的值。  由此产生的正则表达式如下所示。

^(a|b|c)x[0-9]{0,10}_1

其中:

  • (a|b|c)dict1的关键,dict可以包含一个或多个值。

  • xsource2的值。

  • -1是我将从source3获得的价值。

我对我所拥有的解决方案不满意,这基本上是串联构建正则表达式的源代码。我想知道是否还有其他更好更好的解决方案。这是我提出的解决方案。

group1 = "|".join(dict1.keys())
regex = "^("+group1+")"+source2+"[0-9]{0,10}"+source3

非常感谢您的帮助。可能是re.verbose?但我不确定最好的方式。

2 个答案:

答案 0 :(得分:0)

只要表达式足够简单,您还可以通过手动解析来避免正则表达式转义问题:

def parse(s):
    assert max(len(k) for k in dict1) == 1 and len(source2) == 1 #keep it simple

    match = (s[0:1] in dict1 and 
        s[1:2] == source2 and
        all(c in string.digits for c in s[2:-2]) and
        len(s[2:-2]) <= 10 and
        s[-2:] == source3)
    return s[0] if match else None

答案 1 :(得分:0)

您可以在http://htql.net使用htql.RegEx。像这样:

import htql; 
a=htql.RegEx(); 
a.setNameSet('group1', dict1.keys() )
a.setNameSet('x', [source2])
a.setNameSet('x1', [source3])
results=a.reSearchStr(address, "^&[s:group1]&[s:x][0-9]{0,10}&[s:x1]", case=False);