正则表达式筛选字符串列表求助:修正逻辑获目标结果
嘿,我来帮你搞定这个正则的问题!你现在的需求很明确:要保留列表里的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

