用 re.findall(r'.{n}') 可按固定长度切分字符串,但会丢弃末尾不足 n 的部分;改用 r'.{1,n}' 或切片推导式 [s[i:i+n] for i in range(0, len(s), n)] 更稳妥,后者天然保留末段且更高效。

直接用 re.findall() 配合点号通配符即可实现按固定长度正则切分,但要注意它会自动丢弃末尾不足长度的部分。
用 re.findall(r'.{N}') 提取完整段
这是最简方式:匹配任意 N 个字符(除换行符外)的连续子串。
-
N 是你要的切分长度,例如
r'.{4}'表示每 4 字符一组 - 只匹配“刚好 N 个字符”的片段,末尾不足 N 的部分会被忽略
- 若字符串含换行符且需跨行匹配,加
re.DOTALL标志
示例:
import re
re.findall(r'.{3}', s) → ['abc', 'def', 'ghi']
('jk' 被丢弃)
保留末尾不完整段:改用 r'.{1,N}'
把固定长度匹配换成“1 到 N 个字符”,就能捕获最后一段。
- 写成
r'.{1,5}'表示“取 1–5 个字符”,配合findall会自然覆盖结尾 - 注意:这会导致第一段可能只有 1 个字符(除非你确保字符串长度 ≥ N)
- 更稳妥的做法是先用
.{N},再手动补上余数段:s[len(s)//N * N:]
比正则更推荐:切片 + 列表推导式
绝大多数场景下,不用正则更快、更直观、更可控。
- 代码简洁:
[s[i:i+N] for i in range(0, len(s), N)] - 天然保留末段,无论长短;越界自动截断,完全安全
- 无正则编译开销,对纯长度切分来说没有额外优势
需要特殊逻辑时才考虑正则
比如:只切分字母数字段、跳过空格/标点、或按 Unicode 字符宽度(非字节)切分——这时才需定制 pattern,例如:
-
re.findall(r'[a-zA-Z0-9]{4}', s):只取连续 4 个字母数字 -
re.findall(r'\S{4}', s):每 4 个非空白字符一组 - 处理中文等宽字符时,注意
.默认匹配单字节,应改用[\u4e00-\u9fff]等范围











