2013-05-15 30 views
3

我想構建一個依賴於來自許多不同來源的變量的正則表達式。在Python中構建一個詳細的正則表達式

來源:

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

我想建立一個正則表達式,這將取決於我會從上述來源得到的值。 生成的正則表達式如下所示。

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

其中:

  • (a|b|c)dict1dict鍵可以具有一個或多個值。

  • x是值從source2

  • -1是我將從source3得到的值。

我不滿意,我有這基本上是串聯的來源建立正則表達式的解決方案。我想知道是否還有其他更好更好的解決方案。這是我提出的解決方案。

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

會感謝您的幫助。可能是re.verbose?但我不確定最好的方法是什麼。

+6

似乎合理。只要確保[escape](http://docs.python.org/2/library/re.html#re.escape)正確,您的輸入應包含保留字符,例如'source2 =「。」' – jensgram

+0

只需對基本思想進行微調即可:'regex =「^(%s)%s [0-9] {0,10}%s」%(「|」.join(dict1) ,source2,source3)' –

回答

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 
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);