如何用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
相关产品推荐
相关产品推荐

