Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中构建详细的正则表达式_Python_Regex - Fatal编程技术网

在python中构建详细的正则表达式

在python中构建详细的正则表达式,python,regex,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可以有一个或多个值 x是来自source2的值 -1是我将从源3

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

资料来源:

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
    是我将从
    源3
    获取的值

我不满意我的解决方案,它基本上是连接源代码来构建正则表达式。我想知道是否还有其他更好、更好的解决方案。这是我提出的解决方案

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

谢谢你的帮助。可能是
re.verbose
?但是我不确定什么是最好的方法。

只要表达式足够简单,您也可以通过手动解析来避免正则表达式逃避麻烦:

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
def解析:
断言max(len(k)表示dict1中的k)==1和len(source2)==1#保持简单
match=(第1条中的s[0:1]和
s[1:2]==源2和
所有(字符串中的c。s[2:-2]中的c的数字)和
len(s[2:-2])您可以在以下位置使用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); 

似乎是合理的。只要确保您的输入正确地包含保留字符,例如,
source2=“.”
只是对基本思想进行了一些小的调整:
regex=“^(%s)%s[0-9]{0,10}%s”%(“|”。.join(dict1),source2,source3)