Python正则[0-9]*匹配"(2434525)"返回空串的原因
正则匹配空串问题的根本原因
这个现象是正则量词规则+re.search扫描逻辑共同作用的结果,核心逻辑拆解如下:
- 两个量词的核心匹配要求差异:
*对目标模式的匹配要求是0次或多次,哪怕一个目标字符都没匹配到(空串),也算合法匹配+对目标模式的匹配要求是1次或多次,必须至少匹配到1个目标字符才算合法,空串不符合匹配规则
re.search的执行逻辑是从字符串最左端开始逐位置扫描,只要在当前位置找到第一个符合规则的匹配结果,就立刻返回,不会继续向后搜索更长的匹配。
逐行解释测试结果
你写的三段测试代码返回结果差异完全符合上述规则:
re.search(r'[0-9]*', '(123)').group() # 返回''
引擎首先扫描字符串索引0的位置,也就是字符(:这个位置本身不是数字,但是[0-9]*允许匹配0个数字(空串),已经构成合法匹配。引擎直接返回这个位置的空匹配,不会向后走到123所在的位置继续查找。re.search(r'[0-9]*', '123)').group() # 返回'123'
引擎扫描索引0位置时,第一个字符就是数字1,*是贪婪匹配,会连续匹配后续所有连续数字,直到遇到非数字的)才停止,所以直接返回匹配到的123。re.search(r'[0-9]+', '(123)').group() # 返回'123'
引擎在索引0的(位置尝试匹配时,因为+要求至少匹配1个数字,空串不算合法结果,这里匹配失败,于是引擎向后移动一位到索引1的位置(即字符1),在这里匹配到连续的123,正常返回结果。
实用提示:如果目标是提取字符串里的数字,不要单独给数字字符类加
*量词,很容易在非数字位置匹配到空串。优先用+要求至少匹配1位数字,如果要提取所有数字片段,直接用re.findall(r'\d+', 待匹配字符串)即可,不会出现空匹配问题。
内容的提问来源于stack exchange,提问作者Vishnubly
相关产品推荐
相关产品推荐

