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

正则表达式筛选字符串列表求助:修正逻辑获目标结果

正则表达式过滤问题的解决方案

嘿,我来帮你搞定这个正则的问题!你现在的需求很明确:要保留列表里的SOPL、ZTE、ROS这些单词,只去掉**FIRS0425这种带4位数字的前缀,但原代码的结果把不该删的也删了,咱们来调整一下。

先说说原正则的问题:你写的^[*A-Z]+(0-9){4}$其实是匹配「以*或大写字母开头,结尾是4位数字的完整单词」,这个逻辑本身是对的,但你说结果里少了SOPL这些,大概率是实际运行时的正则可能和你写的有出入?不过没关系,咱们直接针对你的需求来写精准的规则。

你的核心需求是:只排除像**FIRS0425这种「开头有星号、跟着大写字母、最后带4位数字」的单词,其他所有单词(纯大写的、带星号但没数字的、普通大小写的)都要保留。

那修改后的代码可以这样写:

import re
list12 = ['**FIRS0425 SOPL ZTE First Company limited', 'Apple Technology','*ROS Sami']
result = [item2 for item in list12 for item2 in item.split() if not re.match(r"^[*]+[A-Z]+[0-9]{4}$", item2)]
print(result)

我给你拆解下这个新正则r"^[*]+[A-Z]+[0-9]{4}$"的每个部分:

  • ^:固定匹配单词的开头位置
  • [*]+:匹配1个或多个连续的星号
  • [A-Z]+:匹配1个或多个大写英文字母
  • [0-9]{4}:精准匹配恰好4位阿拉伯数字
  • $:固定匹配单词的结尾位置

这样一来,只有**FIRS0425会被这个正则匹配到,从而被过滤掉;像SOPL(没星号也没数字)、ZTE(纯大写)、*ROS(带星号但没数字)都不会被匹配,所以都会被保留下来。

运行这段代码,得到的结果是:['SOPL', 'ZTE', 'First', 'Company', 'limited', 'Apple', 'Technology', '*ROS', 'Sami']

如果你还想把*ROS前面的星号去掉,变成纯ROS,那可以再加一步处理,用re.sub去掉开头的所有星号:

import re
list12 = ['**FIRS0425 SOPL ZTE First Company limited', 'Apple Technology','*ROS Sami']
result = [re.sub(r"^[*]+", "", item2) for item in list12 for item2 in item.split() if not re.match(r"^[*]+[A-Z]+[0-9]{4}$", item2)]
print(result)

这下输出就完全符合你的期望了:['SOPL', 'ZTE', 'First', 'Company', 'limited', 'Apple', 'Technology', 'ROS', 'Sami']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:49:18