[英]Regex python findall issue
从测试字符串:
test=text-AB123-12a
test=text-AB123a
我只需要提取'AB123-12'
和'AB123'
,但是:
re.findall("[A-Z]{0,9}\d{0,5}(?:-\d{0,2}a)?", test)
收益:
['', '', '', '', '', '', '', 'AB123-12a', '']
这些多余的空白是什么? 如何删除它们?
量词{0,n}
将匹配从0到n次出现的先前模式。 由于您匹配的两个模式允许出现0,第三个是可选的( ?
),它将匹配长度为0的字符串,即字符串中的每个字符。
编辑以找到每个图案的最小值 1, 最大值 9和5会产生正确的结果:
>>> test='text-AB123-12a'
>>> import re
>>> re.findall("[A-Z]{1,9}\d{1,5}(?:-\d{0,2}a)?", test)
['AB123-12a']
如果没有关于您要匹配的字符串到底是什么样子的详细信息,我无法给出更好的答案。
模式设置为匹配长度为零的字符,而字符集量词的下限设置为0。只需将其设置为1即可产生所需的结果:
>>> import re
>>> test = ''' test=text-AB123-12a
... test=text-AB123a'''
>>> re.findall("[A-Z]{1,9}\d{1,5}(?:-\d{0,2}a)?", test)
['AB123-12a', 'AB123']
RegEx测试人员: http : //www.regexpal.com/说您的模式字符串[AZ]{0,9}\\d{0,5}(?:-\\d{0,2}a)?
可以匹配0个字符,因此可以无限匹配。
再检查一次您的表情。 Python给您未定义的结果。
由于模式的所有部分都是可选的(您的范围指定零到N次出现,并且您要用?
限定组),因此字符串中的每个位置都算作一个匹配项,并且大多数都是空匹配项。
如何防止这种情况的发生,取决于您要匹配的内容的确切格式。 比赛的所有这些部分真的是可选的吗?
由于开头字母或数字是可选的,因此必须确保至少有一个字母或一个数字,否则您的模式将与字符串中每个位置的空字符串匹配。 您可以先行完成图案。 例:
re.findall(r'(?=[A-Z0-9])[A-Z]{0,9}\d{0,5}(?:-\d\d?)?(?=a)', test)
这样,比赛可以以字母或数字开头。
我假设当有连字符时,其后至少要有一个数字(否则此连字符的原因是什么?)。 换句话说,我假设-a
是不可能的。 (如果我错了纠正我。)
为了从匹配结果中排除“ a”,我将其提前放置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.