是否有一种优雅的方式来看看整个字符串是否只包含匹配?

时间:2016-01-23 21:06:03

标签: python regex

Python 2(使用re模块)。

我想在一个字符串中找到这些匹配项,例如'< / lt;< />< 52>'...但我还想检查这些匹配是否构成整个字符串(来自正则表达式模式的NB你也可以看到'< 66 />'是另一种可接受的模式。)

match_obj_iter = re.finditer( ur'(</?\d+>)|(<\d+/>)', str )
for match_obj in match_obj_iter:
    print( '# match found: group |%s|' % ( match_obj.group() ) )

当然,一种方法是在每次迭代时检查match_obj的结尾=前一个match_obj的开始......第一个是0,最后一个是len(str)。

我只是想知道是否有更好的正则表达式程序(例如,如果我不需要特别迭代匹配)。

2 个答案:

答案 0 :(得分:1)

你可以通过你的正则表达式来检查它,并检查这是你的字符串的开头和结尾之间唯一存在的东西:

if re.match(ur'^((</?\d+>)|(<\d+/>))+$', str):
    print 'Matches the whole string'
else:
    print 'Doesn\'t match the whole string'

答案 1 :(得分:0)

您可以修改正则表达式来执行此操作:

re.match(ur'^(?:(?:</?\d+>)|(?:<\d+/>))+$', str)

仅当字符串由(</?\d+>)|(<\d+/>)的一个或多个匹配组成且字符串中没有其他字符时才匹配。

要查找0或更多内容,只需将+替换为*

re.match(ur'^(?:(?:</?\d+>)|(?:<\d+/>))*$', str)

请注意,我将像(group)这样的捕获组替换为非捕获组,例如(?:group),这样可以节省内存并使这样的布尔匹配更快。