python中的联合正则表达式有时会失败
我使用正则表达式来验证某些数据的格式是否正确,有时甚至会失败 我有多个字段的数据条目。只有少数字段在格式上足够一致,或者从不为空以进行验证,所以我创建了一个小正则表达式来匹配这些字段。我想将字段和正则表达式连接在一起,并对每个条目调用match()。尽管所有单个字段都与各自的正则表达式匹配,但联接检查失败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
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:对,但您原来的三个测试允许这些匹配。您从未将这些限制为仅匹配整个列。