首页 > 解决方案 > 以一个模式开始但不以另一个模式结束的正则表达式

问题描述

假设我有这个玩具pandas.Series

import pandas as pd
s = pd.Series(['GarageQual', 'GarageArea', 'GarageCars', 'GarageTestCars', 'GaraFail'])
# 0        GarageQual
# 1        GarageArea
# 2        GarageCars
# 3    GarageTestCars
# 4        GaraFailed
# dtype: object

我想选择其值以模式开头'Garage' 且不以模式结尾的所有'Cars';因此我想要的结果是

# 0        GarageQual
# 1        GarageArea

注意:我想通过正则表达式匹配来达到它。


我已经尝试了几次但无济于事

s.loc[s.str.match('^Garage.*[^Cars]$')]
# 0    GarageQual
# dtype: object

s.loc[s.str.match('^Garage.*^(Cars)$')]
# Series([], dtype: object)

s.loc[s.str.match('^Garage.*^(?!Cars)$')]
# Series([], dtype: object)

我觉得我非常接近解决方案,但我没有达到我想要的结果。

标签: pythonregexpandasseries

解决方案


您可以使用以下正则表达式: ^Garage.*(?:[^C].{3}|C[^a].{2}|Ca[^r].{1}|Car[^s])$

正则表达式演示

^Garage(?!.*Cars$)如果您使用具有回溯支持的库,也可以使用

正则表达式演示


推荐阅读