如何用正则从含可选STEP段的字符串中一次性提取对应数值?
问题原因
你的正则写法逻辑没问题,但踩了贪婪匹配的坑。.*是贪婪匹配规则,会优先尽可能多地吞掉字符串所有内容,而后面的(STEP=([0-9]+))?是可选分组,正则引擎判断该分组匹配0次也能满足整体匹配要求,就不会再回溯找STEP部分,最终两个分组自然都是None。
解决方案
单次正则调用完全可以实现需求,只要调整匹配规则,把贪婪匹配改成非贪婪匹配,再加上字符串结尾锚即可:
import re # 如果你不需要捕获STEP=前缀,只需要数值,用这个写法,只有1个捕获分组 pattern = r".*?(?:STEP=(\d+))?$" # 测试带STEP的字符串 res0 = re.search(pattern, "identifier STEP=10").groups() # 测试不带STEP的字符串 res1 = re.search(pattern, "identifier").groups()
执行结果:
res0为('10',)res1为(None,)
如果你要保留和你之前写法一致的两个捕获分组(第一个分组匹配完整的STEP=xxx段,第二个匹配数值),可以用下面的写法:
pattern = r".*?(STEP=(\d+))?$" res0 = re.search(pattern, "identifier STEP=10").groups() res1 = re.search(pattern, "identifier").groups()
执行结果:
res0为('STEP=10', '10')res1为(None, None)
你提到的期望输出(None, "10")不符合正则分组的捕获逻辑,如果你只要数值,用第一种单分组的写法完全可以满足需求,不需要额外二次处理。
内容的提问来源于stack exchange,提问作者Hans Wurst
相关产品推荐
相关产品推荐

