我正在尝试构建一个依赖于来自许多不同来源的变量的正则表达式。
来源:
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
可以包含一个或多个值。
x
是source2
的值。
-1
是我将从source3
获得的价值。
我对我所拥有的解决方案不满意,这基本上是串联构建正则表达式的源代码。我想知道是否还有其他更好更好的解决方案。这是我提出的解决方案。
group1 = "|".join(dict1.keys())
regex = "^("+group1+")"+source2+"[0-9]{0,10}"+source3
非常感谢您的帮助。可能是re.verbose
?但我不确定最好的方式。
答案 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);