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

Python 3.12正则匹配:排除以指定数字结尾的整数

解决方案

方法一:纯正则匹配

使用以下正则表达式可以直接匹配所有不以指定数字序列(如175)结尾的完整整数:

import re

text = "12345 67890 123175 9876"
matches = re.findall(r'\b\d+\b(?<!175)', text)
print(matches)
# 输出: ['12345', '67890', '9876']

正则说明:

  • \b:匹配单词边界,确保捕获完整整数,避免部分数字匹配。
  • \d+:匹配一个或多个数字。
  • (?<!175):负向后顾断言,检查当前匹配的数字结尾不是175,若是则排除该匹配。

如果要更精确匹配数字后的场景(空格、行尾或文本结尾),可以用:

matches = re.findall(r'(?<!\d)\d+(?<!175)(?=\s|$)', text)
  • (?<!\d):确保数字前不是其他数字,避免从长数字中间开始匹配。
  • (?=\s|$):正向预查,确保数字后是空格或行尾,符合你描述的数字后跟随规则。

方法二:正则提取+Python过滤(更直观)

如果觉得正则逻辑绕,也可以先提取所有整数,再用字符串方法过滤不符合要求的:

import re

text = "12345 67890 123175 9876"
all_nums = re.findall(r'\b\d+\b', text)
filtered_nums = [num for num in all_nums if not num.endswith('175')]
print(filtered_nums)
# 输出: ['12345', '67890', '9876']

这种方法逻辑清晰,维护简单,修改排除后缀时直接调整endswith的参数即可。


你之前尝试的问题分析

  1. \d+(?<!175)(\b|$):使用了分组(\b|$),findall会优先返回分组内的匹配内容(空格或行尾的空匹配),所以得到空字符串;同时无完整数字限制,可能出现部分截取。
  2. \d+(?!175)(\b|$):同样存在分组返回问题,且(?!175)是正向预查,检查的是数字后面不是175,而非数字本身不以175结尾,逻辑不符需求。
  3. \d+(?<!175):无单词边界限制,遇到123175时,正则会回溯匹配12317(完整的123175不满足(?<!175)),导致错误匹配。
  4. \d+(?:175):这是匹配以175结尾的数字,和你的需求完全相反。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:36:04