编写正则表达式:替换除单数字.单数字外的所有句点为空格
解决方案:精准替换句点但保留特定数字格式
嘿,这个需求挺常见的——尤其是处理影视文件名的时候,要替换分隔用的句点,但得像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
相关产品推荐
相关产品推荐

