Поскольку случаи взаимоисключающие и полные, логику можно упростить до
"Для алфавитной подстроки длиной> 2 и с 'HP' удалите первый 'HP', в противном случае оставьтеподстрока как есть. "
Сначала используйте regex для удаления неалфавитных частей каждой строки, затем реализуйте логику с помощью простого оператора if-else.
import pandas as pd
import re
df= pd.DataFrame({'test_column': ['AB124','3847937BB','HP111','PG999-HP222','1222HP','HP3333-22HP','111HP3939DN']})
for index,row in df.iterrows():
target_value = row['test_column'] #array
regex = re.compile("[^A-Z]")
code = regex.sub('',target_value)
if len(code) > 2 and 'HP' in code:
possible_code = code.replace('HP','',1)
else:
possible_code = code
print(possible_code)
дает по желанию:
AB
BB
HP
PG
HP
HP
DN