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

编写正则表达式:替换除单数字.单数字外的所有句点为空格

解决方案:精准替换句点但保留特定数字格式

嘿,这个需求挺常见的——尤其是处理影视文件名的时候,要替换分隔用的句点,但得像5.1、7.1这种单个数字+句点+单个数字的格式必须保留对吧?我给你拆解一下可行的方案:

核心思路

我们的目标很明确:只保留「单个数字 . 单个数字」这种模式里的句点,其他所有句点全部替换成空格。说白了,就是要找出所有不满足「前后都是单个数字」的句点,把它们替换掉。

正则表达式写法

这里给你两种适配大多数主流正则引擎(Python、JavaScript、Java等都能用)的写法:

写法一:逻辑清晰的断言组合

这个版本把所有需要替换的句点类型都列出来,一目了然:

\.(?<!\d)|\.(?!\d)|(?<=\d{2,})\.|(?<=\d)\.(?=\d{2,})

逐个解释一下:

  • \.(?<!\d):匹配前面不是数字的句点(比如Cast.Away里的.)
  • \.(?!\d):匹配后面不是数字的句点(比如BATV <6>-20前的.)
  • (?<=\d{2,})\.:匹配前面是2个及以上数字的句点(比如2012.2008里的.)
  • (?<=\d)\.(?=\d{2,}):匹配后面是2个及以上数字的句点(比如2016.720p里的.)

写法二:利用单词边界简化

如果你的场景里数字不会和其他字符连在一起(比如不会出现a5.1b这种奇怪的格式),可以用更简洁的版本:

\.(?<!\b\d)|\.(?!\d\b)
  • \b\d:表示单个数字作为独立的“片段”(前后不是数字)
  • \d\b:同理,单个数字结尾的独立片段

实际使用示例

拿Python来测试一下你的示例:

import re

# 测试第一个示例
text1 = "2012.2008.The.Victorias.Secret.Fashion.Show.2016.720p.HDTV.x264-HD.MA.5.1 21d.BATV <6>-20"
result1 = re.sub(r'\.(?<!\d)|\.(?!\d)|(?<=\d{2,})\.|(?<=\d)\.(?=\d{2,})', ' ', text1)
print(result1)
# 输出:2012 2008 The Victorias Secret Fashion Show 2016 720p HDTV x264-HD MA 5.1 21d BATV <6>-20

# 测试第二个示例
text2 = "Resident.Evil.The.Final.Chapter.2016.BluRay.1080p.AVC.DTS-HD.MA7.1-LKReborn-CHDBits"
result2 = re.sub(r'\.(?<!\d)|\.(?!\d)|(?<=\d{2,})\.|(?<=\d)\.(?=\d{2,})', ' ', text2)
print(result2)
# 输出:Resident Evil The Final Chapter 2016 BluRay 1080p AVC DTS-HD MA7.1-LKReborn-CHDBits

小提醒

如果你的正则引擎不支持后行断言(比如非常旧版本的JavaScript),可以换成分组捕获的方式:先把要保留的\d\.\d捕获下来,替换其他句点后再把捕获的内容放回去。不过现在主流的正则引擎基本都支持前后断言了,这个问题不大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:39:21