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的参数即可。
你之前尝试的问题分析
\d+(?<!175)(\b|$):使用了分组(\b|$),findall会优先返回分组内的匹配内容(空格或行尾的空匹配),所以得到空字符串;同时无完整数字限制,可能出现部分截取。\d+(?!175)(\b|$):同样存在分组返回问题,且(?!175)是正向预查,检查的是数字后面不是175,而非数字本身不以175结尾,逻辑不符需求。\d+(?<!175):无单词边界限制,遇到123175时,正则会回溯匹配12317(完整的123175不满足(?<!175)),导致错误匹配。\d+(?:175):这是匹配以175结尾的数字,和你的需求完全相反。
内容的提问来源于stack exchange,提问作者adi
相关产品推荐
相关产品推荐

