正则与模式匹配

Python 正则表达式在线测试核对真实 re 结果

输入 Python 表达式与测试文本,手动检查捕获组、位置和替换预览。首次测试才加载运行时。

Python 正则表达式在线测试

表达式

测试文本

结果

等待输入或手动测试。

表达式与测试文本只在本浏览器处理。首次测试时才加载 Python 运行时文件。

选项

i、m、s、x、a 各最多一次;没有 JavaScript 的 g 标志。
  • i — 忽略大小写
  • m — ^ 和 $ 匹配行边界
  • s — 点号匹配换行
  • x — 忽略模式空白并允许注释
  • a — 字符类采用 ASCII 规则

Python 运行时:首次测试时加载

上限:表达式 2000、文本 100000、替换模板 10000 个 UTF-16 单位;10000 条匹配、百万单位输出、四百万单位报告。执行超过两秒会终止。

等待输入或手动测试。

同一段模式在 JavaScript 测试器里成功,不代表放进 Python 后也能运行。Python 正则表达式在线测试直接调用 CPython 的 re,能在写代码前看到命名组、标志和反向引用的实际结果。

需要 Python 正则测试器时,可以分别比较 finditer、search 和 fullmatch。Python 正则匹配的起止位置按 Unicode 码点计数;Python 正则替换则使用 \g<name>,不是 JavaScript 的 $1。

为什么用 Python 正则表达式在线测试

把捕获内容和位置对起来

Python 正则表达式在线测试将整体匹配、编号组和命名组并列展示。未参与的分组保留 null 与 (-1, -1),真正捕获到的空串则显示为空字符串,方便排查可选字段。

一段蓝色整体匹配包住青色和橙色两个捕获片段,分别连到结果卡片。

替换先预览,不覆盖原文

用 \g<last> 和 \g<first> 调换捕获字段时,真实 re.subn 会生成另一份结果。替换次数为 0 表示全部替换;原始测试文本仍在左侧,便于逐处比对。

原文中的两个彩色片段在右侧预览里交换顺序,原文仍保留。

先核对 Python 语义,再取结果

01

选对查找范围

finditer 列出所有不重叠命中,search 只找首项,fullmatch 要求整段文本完全命中。这里没有 JavaScript 的 g 标志;改动模式后旧报告会立即过期。

02

明确标志和执行时机

i、m、s、x、a 对应 Python re 标志。m 影响行首与行尾,s 才让点号跨过换行。表达式不会随着每次输入自动运行;首次手动测试时才加载 Python。

03

检查位置再导出

分组位置从 0 起算,末尾不包含在内,单位是 Unicode 码点。A😀B 里的 B 起点是 2;浏览器高亮会换算 UTF-16 位置。可按 Ctrl/Cmd + Enter 重新测试。

匹配报告能看到什么

真实 CPython re

Python 正则表达式在线测试通过 Pyodide 在独立线程加载 CPython,并展示实际版本,不用 JavaScript RegExp 冒充 Python。

分组值与准确范围

每条命中保留 group 0、编号与名称、值及位置。含 emoji 的文本会先把 Python 码点位置换算成浏览器偏移,避免高亮错位。

按 Python 模板替换

Python 正则替换预览使用 re.subn;\1 和 \g<name> 会展开,空模板会删除命中,$1 在这里仍是普通文本。

完整报告才允许导出

运行成功后可复制或下载 JSON,记录表达式、标志、操作、Python 版本和全部结果;替换模式还可导出文本。

这次测试的真实边界

固定 Python 引擎
Python 正则表达式在线测试只执行 CPython re 的 Unicode 文本模式,不切换 PCRE2、JavaScript 或第三方 regex 包;这些语法不能靠改标签混用。
只在手动触发时运行
复杂模式可能长时间回溯。两秒预算从 Python 加载完成后开始,超时会终止 Worker;不会把部分结果伪装成零命中。
不接受 JavaScript 标志
只接收 i、m、s、x、a 且每项最多一次。全部匹配由 finditer 决定,Python 字符串默认按 Unicode 处理,无需 g、u 或 y。
输入与报告有明确上限
表达式 2000、测试文本 100000、替换模板 10000 个 UTF-16 单位;超过 10000 条命中、百万单位输出或四百万单位报告时整次失败。
不执行任意 Python 代码
只调用固定的 re 操作,不运行粘贴的脚本,不读取文件或 URL,也不把测试文本写进分享链接。
预览不是改写
re.subn 的结果单独展示。示例和清空会改输入,必须先确认预览,应用后可撤销一次。

关于 Python 正则表达式在线测试的常见问题

为什么模式在 regex101 能用,放进 Python 却报错?

先看 regex101 选的是不是 Python 引擎;它可能默认 PCRE2。本页运行真实 CPython re,例如命名组写作 (?P<name>...)。

这里能测试 Python 的 re.sub 替换吗?

能。选择替换操作并填模板,\g<name> 与 \1 按 Python 规则展开,$1 不会被当成分组。结果只做预览,不覆盖原文。

能在线查看 Python 正则的匹配和捕获组吗?

可以。每条命中都有高亮、分组值和位置;零宽命中也会标出位置。Python 在浏览器独立线程中运行。

为什么 .*? 有时比 .* 更安全?

前者优先尝试较短的可行片段,后者先尝试最长片段。两者都不保证不会慢;用真实边界样本测试,必要时停止运行。

(...) 和 (?:...) 有什么区别?

两者都能组合模式,但只有 (...) 占用捕获编号,可在分组结果或替换模板中引用;(?:...) 只分组,不产生捕获。

还有疑问?

拿真实边界样本试试 Python 正则表达式在线测试

把预期命中和不命中的文本一起检查,确认捕获组与 Python 版本后再导出报告。