繁体   English   中英

正则表达式python findall问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM