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

如何用Python正则表达式查找数字序列中的非重复数字?

用Python正则表达式查找数字序列中的非重复数字

当然可以用正则表达式实现这个需求,但你当前的代码存在几个核心问题,没法正确定位到唯一不重复的数字:

  • 直接将数字拼接成字符串会导致位数混淆,比如[12, 1, 2]会变成"1212",完全无法区分原始数字;
  • string_nums.replace(',','')操作没生效——字符串是不可变类型,replace会返回新字符串,你需要重新赋值给变量;
  • 当前正则r"(^[,]?)([1-9]{1})?"只能匹配开头的可选逗号和单个数字,完全没有处理重复数字的逻辑。

可行实现方案

要让正则能正确识别重复数字,首先得用分隔符把每个数字隔开,避免位数干扰,再利用反向引用匹配重复项,最后提取唯一未重复的数字:

import re
from typing import List

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        # 用|作为分隔符,避免数字拼接后混淆
        nums_str = "|".join(map(str, nums))
        # 匹配所有重复出现的数字:捕获一个数字,再匹配到它的第二次出现
        duplicate_pattern = r"(\b\d+\b).*?\1"
        duplicates = re.findall(duplicate_pattern, nums_str)
        # 用否定前瞻匹配不在重复列表里的数字
        single_pattern = rf"\b(?!({'|'.join(duplicates)}))\d+\b"
        single_num_str = re.search(single_pattern, nums_str).group()
        return int(single_num_str)

# 测试示例
sol = Solution()
print(sol.singleNumber([2,2,1]))  # 输出 1
print(sol.singleNumber([4,1,2,1,2]))  # 输出 4

正则逻辑拆解

  • \b\d+\b:通过单词边界确保匹配完整的数字,不会误匹配数字的片段;
  • (\b\d+\b).*?\1:捕获一个数字后,匹配任意内容(非贪婪模式),再通过反向引用\1匹配同一个数字,以此找出所有重复出现的数字;
  • (?!({'|'.join(duplicates)})):否定前瞻断言,确保当前匹配的数字不在重复列表中,从而定位到唯一的非重复数字。

内容的提问来源于stack exchange,提问作者Adrian . EXE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:54:23