Python正则非捕获组在捕获组内失效问题咨询
正则表达式非捕获组使用问题解答
问题根源
你对非捕获组的理解存在偏差:(?:...)仅表示该组不会生成独立的捕获结果,但它匹配到的字符依然会被包含在其所属的外层捕获组中。你把\[和\]放在了symbol命名分组内部,所以这两个符号自然会被纳入symbol的匹配结果里,和是否用非捕获组无关。
修正方案
要让symbol只包含数字和原子符号(不含[]),只需将\[和\]移出symbol分组即可,非捕获组可以用来包裹这两个符号以避免生成多余的捕获组:
import re # 修正后的正则:[]被放在symbol分组外部,用非捕获组包裹 result = re.match(r'(?:\[)(?P<symbol>(?P<num>[0-9]{0,3})(?P<atom>C))(?:\])', '[12C]') print(result.groups()) # 输出:('12C', '12', 'C'),符合预期
或者更简洁的写法(去掉非捕获组也不影响,因为我们不需要捕获[]):
import re result = re.match(r'\[(?P<symbol>(?P<num>[0-9]{0,3})(?P<atom>C))\]', '[12C]') print(result.groups()) # 输出:('12C', '12', 'C')
内容的提问来源于stack exchange,提问作者basil_man
相关产品推荐
相关产品推荐

