Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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,我使用正则表达式来验证某些数据的格式是否正确,有时甚至会失败 我有多个字段的数据条目。只有少数字段在格式上足够一致,或者从不为空以进行验证,所以我创建了一个小正则表达式来匹配这些字段。我想将字段和正则表达式连接在一起,并对每个条目调用match()。尽管所有单个字段都与各自的正则表达式匹配,但联接检查失败 regs = ['\d.\d','[a-z][a-z]','\d{1,2}'] # list of regexes indeces = [4, 15, 77] # list of indece

我使用正则表达式来验证某些数据的格式是否正确,有时甚至会失败

我有多个字段的数据条目。只有少数字段在格式上足够一致,或者从不为空以进行验证,所以我创建了一个小正则表达式来匹配这些字段。我想将字段和正则表达式连接在一起,并对每个条目调用match()。尽管所有单个字段都与各自的正则表达式匹配,但联接检查失败

regs = ['\d.\d','[a-z][a-z]','\d{1,2}'] # list of regexes
indeces = [4, 15, 77] # list of indeces
for line in stdin:

    linesplit = line.rstrip().split('\t')
    testline = []
    for index in indeces:
        testline.append(linesplit[index])

    for i, e in enumerate(testline):
        print i, e, re.match(regs[i], e)
这很好,但当我尝试最后一点时,它有时会失败

fullregex = re.compile('\t'.join(regs))
f = fullregex.match('\t'.join(testline).rstrip())
print 'F', f, '!'

我的fullregex是否有问题,或者我得到的匹配结果只是误报?

您的单个正则表达式可以在一列中匹配,但您的联接表达式不能

例如,输入:

['1.1 bar', 'hello', '123 is a number']
匹配您的单个表达式,但当与其间的选项卡连接时,将不再匹配
fullregex
模式

[^\t]*
作为“填充”添加到表达式中,以允许在选项卡周围使用额外的not tab字符:

fullregex = re.compile(r'[^\t]*\t[^\t]*'.join(regs))
演示:

其中
all()

  • 或者使用
    \t
    连接列,但也要添加锚定:

    re.match('^{}$'.format('\t'.join(regs)), '\t'.join(testline))
    
  • 演示:

    >regs=['\d.\d','[a-z][a-z]','\d{1,2}']
    >>>测试线=['1.1','he','12']
    >>>全部(expr的re.match('^{}$'.format(expr),col),zip中的col(regs,testline))
    真的
    >>>re.match('^{}$'.format('\t'.join(regs)),'\t'.join(testline))
    >>>testline=['1.1bar','hello','123是一个数字']
    >>>全部(expr的re.match('^{}$'.format(expr),col),zip中的col(regs,testline))
    假的
    >>>re.match('^{}$'.format('\t'.join(regs)),'\t'.join(testline))为无
    真的
    
    您的单个正则表达式可以在列中匹配,但您的联接表达式不能匹配

    例如,输入:

    ['1.1 bar', 'hello', '123 is a number']
    
    匹配您的单个表达式,但当与其间的选项卡连接时,将不再匹配
    fullregex
    模式

    [^\t]*
    作为“填充”添加到表达式中,以允许在选项卡周围使用额外的not tab字符:

    fullregex = re.compile(r'[^\t]*\t[^\t]*'.join(regs))
    
    演示:

    其中
    all()

  • 或者使用
    \t
    连接列,但也要添加锚定:

    re.match('^{}$'.format('\t'.join(regs)), '\t'.join(testline))
    
  • 演示:

    >regs=['\d.\d','[a-z][a-z]','\d{1,2}']
    >>>测试线=['1.1','he','12']
    >>>全部(expr的re.match('^{}$'.format(expr),col),zip中的col(regs,testline))
    真的
    >>>re.match('^{}$'.format('\t'.join(regs)),'\t'.join(testline))
    >>>testline=['1.1bar','hello','123是一个数字']
    >>>全部(expr的re.match('^{}$'.format(expr),col),zip中的col(regs,testline))
    假的
    >>>re.match('^{}$'.format('\t'.join(regs)),'\t'.join(testline))为无
    真的
    
    每个正则表达式只验证字段的一部分。是否有理由在连接的正则表达式和测试行中重新验证?这些部分用于测试字段是否不匹配。我所追求的是最后一个匹配,因为当我运行它时,它更快。然后你应该跳过加入regex,并使其静态完整。这将导致更快的性能<代码>'\d.\d[^\t]*\t[^\t]*[a-z][a-z][^\t]*\t[^\t]*\d{1,2}'
    精确匹配函数等价物的
    ['^\d.\d$,'^[a-z][a-z]$','^\d{1,2}$]
    ~
    仅验证regex字段的每个部分。是否有理由在连接的正则表达式和测试行中重新验证?这些部分用于测试字段是否不匹配。我所追求的是最后一个匹配,因为当我运行它时,它更快。然后你应该跳过加入regex,并使其静态完整。这将导致更快的性能<代码>'\d.\d[^\t]*\t[^\t]*[a-z][a-z][^\t]*\t[^\t]*\d{1,2}'
    精确匹配函数等价物的
    ['^\d.\d$,'^[a-z][a-z][a-z]$,'^\d{1,2}$]
    -\d[a-z][a-z]\t\d${1,2}
    ?那不是我想要的。我想和你完全匹配。例如,中间的一个应该只匹配两个小写字母。@Wineblood:对,但您原来的三个测试允许这些匹配。您从未将这些限制为只匹配整个列。这将允许您在testline中编写的条目匹配吗?那不是我想要的。我想和你完全匹配。例如,中间的一个应该只匹配两个小写字母。@Wineblood:对,但您原来的三个测试允许这些匹配。您从未将这些限制为仅匹配整个列。