正则表达式匹配特定数字时过度匹配的问题及解决需求
解决正则过度匹配问题的方案
你的核心问题是要匹配独立的目标数字i,不能是多位数的一部分,同时要排除和s/season绑定的数字,但保留episode后的数字。以下是符合需求的正则表达式方案:
import re target_num = 1 # 可替换为你需要匹配的数字,比如2 pattern = rf"(?:(?<!mp)(?<!\d)(?<!s)(?<!season\s)|(?<=episode\s)){target_num}(?!\d)" # 测试用例 test_strings = [ "xx 1.mp4", "xx 10.mp4", "xx21.mp4", "xx1.mp4", "xx 1 xx.mp4", "xx.1.xxx.mp4", "xx.11.xxx.mp4", "xxx s1e3 xxx.mp4", "xxx season 1 episode 3", "xxx season 2 episode 1" ] for s in test_strings: if re.search(pattern, s): print(f"匹配成功:{s}")
正则各部分解释
(?:...):非捕获分组,用来组合两种匹配场景- 第一种场景
(?<!mp)(?<!\d)(?<!s)(?<!season\s):(?<!mp):保留你原有的需求,排除数字前是mp的情况(?<!\d):排除数字前是其他数字的情况,避免匹配多位数里的目标数字(比如10里的1)(?<!s):排除数字前是s的情况,避免匹配s1e3这类绑定的数字(?<!season\s):排除数字前是season的情况,避免匹配season 1这类绑定的数字
- 第二种场景
(?<=episode\s):专门允许数字前是episode的情况,匹配season 2 episode 1这类属于episode的数字 {target_num}:替换为你需要匹配的目标数字i(?!\d):排除数字后是其他数字的情况,避免匹配11这类多位数里的目标数字
运行结果
执行代码后会输出你预期的匹配内容:
匹配成功:xx 1.mp4 匹配成功:xx1.mp4 匹配成功:xx 1 xx.mp4 匹配成功:xx.1.xxx.mp4 匹配成功:xxx season 2 episode 1
内容的提问来源于stack exchange,提问作者bull11trc
相关产品推荐
相关产品推荐

