Python字符串条件排除:如何过滤以\New或\xNew结尾的列表项
问题背景
- 提问者为Python(Spyder)初学者,过往主要使用SQL、SAS进行数据处理,不熟悉Python下基于字符串规则的条件排除写法
- 现有一份车型列表,需要排除
Model字段所有以\New或\xNew结尾的条目 - 待处理的
Model字段取值包含:Chrysler、Chrysler\New、Chrysler\xNew、Ford\New、Ford\xNew、Ford - 初始参考SQL通配符逻辑编写的代码如下,无法实现预期过滤效果:
for car in cars: if '*\New' not in Model or '*\xNew' not in Model:
错误原因
代码失效是三个核心问题导致的:
- Python原生的
in成员判断仅支持精确子串匹配,不识别SQL风格的*通配符,'*\New' not in Model只会检查字符串中是否存在连续的*\New字符,无法实现“任意前缀+指定后缀”的模糊匹配 - 逻辑运算符使用错误:需要排除两类后缀条目,保留规则是两个后缀都不匹配,如果用
or连接判断条件,只要任意一个后缀不匹配就会进入分支,完全无法过滤目标条目 - 变量引用错误:循环中遍历的单个元素是
car,判断时直接写Model没有对应取值,需要先从car中取出Model字段的值再做判断
实现方案
根据需求优先推荐用Python字符串内置方法实现,不需要额外导包,性能最好、写法最简洁。
方案1:内置endswith()方法(推荐)
字符串自带的endswith()方法专门用于判断后缀,支持传入元组一次性匹配多个后缀,完全匹配需求:
# 测试数据说明:代码里手写带反斜杠的字符串需要用双反斜杠转义,从外部文件/数据源读入的数据不需要手动转义 cars = [ {"Model": "Chrysler"}, {"Model": "Chrysler\\New"}, {"Model": "Chrysler\\xNew"}, {"Model": "Ford\\New"}, {"Model": "Ford\\xNew"}, {"Model": "Ford"} ] valid_cars = [] for car in cars: model = car["Model"] # 排除以\New或\xNew结尾的条目 if not model.endswith(("\\New", "\\xNew")): valid_cars.append(car) print(f"保留车型:{model}")
运行后输出结果符合预期:
保留车型:Chrysler 保留车型:Ford
方案2:fnmatch模块实现通配符匹配
如果更习惯SQL风格的通配符写法,可以用Python标准库fnmatch,它支持*代表任意长度字符的通配规则:
import fnmatch valid_cars = [] for car in cars: model = car["Model"] # 两个通配规则都不命中时保留条目 if not fnmatch.fnmatch(model, "*\\New") and not fnmatch.fnmatch(model, "*\\xNew"): valid_cars.append(car)
这个写法和最初参考SQL的逻辑一致,但注意fnmatch的通配规则仅在模块方法内生效,不能直接和in关键字搭配使用。
内容的提问来源于stack exchange,提问作者2020db9
相关产品推荐
相关产品推荐

