You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式匹配首d尾c子串:为何结果缺失'dcc'?

问题分析

你遇到的问题核心在于正则表达式的匹配机制和re.findall的工作方式,咱们一步步拆解:

为什么当前正则只返回['dc']?

你用的r"d.*?c"是非贪婪匹配:

  1. 它从字符串的第一个d开始匹配,然后找最短的能到c的路径——也就是第一个遇到的c(位置1的那个),所以第一个匹配结果是dc。
  2. re.findall在找到一个匹配后,会从这个匹配的结束位置(也就是索引1)开始继续查找下一个匹配。此时剩下的字符串是c,没有d开头的子串,所以不会有第二个结果。

而你期望的['dc', 'dcc']是从同一个d出发,匹配到后续所有c结尾的子串,这属于重叠匹配的范畴,但正则默认的匹配是“不重叠、匹配后移动指针”的,所以直接用findall+普通正则做不到。

解决方案

要得到所有以d开头、c结尾的子串,有两种常见方式:

方式一:手动遍历生成(直观易懂)

先找到所有d的位置,再对每个d,找到它后面所有c的位置,然后截取对应的子串:

import re

s = "dcc"
result = []
# 找到所有d的索引
d_positions = [idx for idx, char in enumerate(s) if char == 'd']
for d_idx in d_positions:
    # 找到当前d之后所有c的索引
    c_positions = [idx for idx, char in enumerate(s) if char == 'c' and idx > d_idx]
    for c_idx in c_positions:
        result.append(s[d_idx:c_idx+1])

print(result)  # 输出: ['dc', 'dcc']

方式二:结合正则与迭代(灵活适配复杂场景)

如果字符串更复杂,需要用正则判断开头结尾,可以用re.finditer遍历每个可能的起始位置,检查是否符合d.*c的规则,再提取所有可能的子串:

import re

s = "dcc"
result = []
# 遍历每个可能的起始位置
for start in range(len(s)):
    # 从start位置开始匹配以d开头、c结尾的子串
    match = re.match(r"d.*c", s[start:])
    if match:
        full_match = match.group(0)
        # 拆分当前匹配中所有以d开头、c结尾的子串
        c_indices = [idx for idx, char in enumerate(full_match) if char == 'c' and idx > 0]
        for c_idx in c_indices:
            result.append(full_match[:c_idx+1])

print(result)  # 输出: ['dc', 'dcc']

补充说明

如果你的需求只是针对类似dcc这种简单字符串,方式一足够高效;如果是更复杂的正则匹配规则(比如中间有特定字符限制),方式二可以结合正则的优势来实现。

内容的提问来源于stack exchange,提问作者Onion123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:55