Я предлагаю использовать str.extract
с
(?<![^\W_])(SGD|GBP|USD|EUR)(?![^\W_])
См. Демоверсию regex .
Обратите внимание, что (?<![^\W_])
/ (?![^\W_])
- это недвусмысленные границы слова, которые также рассматривают _
(подчеркивание) как "несловесные" символы, поэтому EUR
в _EUR_
считается целым словом.
В Python регулярное выражение может быть построено с использованием r'(?<![^\W_])({})(?![^\W_])'.format('|'.join(map(re.escape, currency)))
, с re.escape
, на тот случай, если у вас могут быть $
или другие специальные символы в именах валют, например CA$
.
import re
import pandas as pd
data = {'Name':['Tom', 'nick', 'krish', 'jack', 'meg', 'sarah'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs', 'More fun in EUROPE', 'And MUSDA thing']}
currency = ['SGD', 'GBP', 'USD', 'EUR']
df = pd.DataFrame(data)
rx = r'(?<![^\W_])({})(?![^\W_])'.format('|'.join(map(re.escape, currency)))
df['Currency_updated'] = df['Currency'].str.extract(rx, expand=False)
Выход:
>>> df
Name Currency Currency_updated
0 Tom RANDOM_SGD_2017 SGD
1 nick TEST_EUR_1381 EUR
2 krish FORFUN GBP GBP
3 jack NAs NaN
4 meg More fun in EUROPE NaN
5 sarah And MUSDA thing NaN