Python正则使用(F|M)D匹配FD/MD时仅返回首字母忽略D是什么原因
问题原因
你遇到的现象不是匹配过程忽略了D,而是re.findall的返回规则和你预期不符:
- Python的
re.findall方法存在特殊返回逻辑:当正则表达式中包含捕获组(即用括号包裹的规则片段)时,方法只会返回每个匹配项里「捕获组匹配到的内容」,不会返回整个正则匹配的完整结果 - 你编写的正则
r"(F|M)D"中仅包含1个捕获组(F|M),匹配MD时这个捕获组仅命中了字符M,所以最终返回结果为['M'],D不属于捕获组的匹配范围,自然不会被单独返回。
解决方法
如果要拿到完整的FD/MD匹配结果,可以选择两种修改方案:
- 去掉不必要的捕获组,改用字符类实现相同的匹配逻辑:
matches = re.findall(r"[FM]D", myString)
无捕获组时re.findall会直接返回整个正则命中的完整结果。
2. 如果必须保留分组结构(比如后续需要用到分组引用),可以将分组改为非捕获组:
matches = re.findall(r"(?:F|M)D", myString)
以?:标记的分组仅用于逻辑组合,不会被findall单独提取返回。
内容的提问来源于stack exchange,提问作者sodiumnitrate
相关产品推荐
相关产品推荐

