re.findall возвращает все неперекрывающиеся совпадения шаблона в строке.
Это означает, что строка используется при поиске совпадения в шаблоне. Поэтому, если подстрока совпадения сама является совпадением, пропускается.
Это то, что происходит с 'mango'
и 'mango juice'
в вашем случае, поскольку ваше регулярное выражение объединяет все строки для сопоставления с or
.
Если вы хотите искать перекрывающиеся регистры, не объединяйте слова для поиска с |
в регулярном выражении, а выполняйте поиск по каждому слову.
def map_function(s, reglst):
matches = [len(re.findall(rg.lower(), s.lower())) for rg in reglst]
return sum(matches)
Здесь я переопределяю ваш map_function
. Он использует понимание списка для выполнения re.findall
один раз для каждого отдельного слова regex_list
и возвращает сумму всех вхождений.
Тогда ваш код будет:
for key, lst in dict_.items():
col_names = [element for element in lst if isinstance(element, str)]
regex_lists = [element for element in lst if isinstance(element, list)]
regex_list = functools.reduce(lambda x, y: x+y, regex_lists)
df_regex_count = df[col_names].applymap(lambda s : map_function(s, regex_list))
df[key] = [sum(lst_tmp) for lst_tmp in df_regex_count.values.tolist()]
Сейчас df
с:
Column_1 s1
0 mango juice pret Orange No manner Emman snow 4
1 préts No scan eblanc 1
EDIT
Ваш список регулярных выражений list1
должен быть примерно таким:
list1 = [r'\bmango juice\b', r'\bMango\b' ,r'\bOrange\b', r'\bpr[éeêè]t[s]?\b']
Итак, список по одному слову на элемент. Глядя на свой код, вы, вероятно, можете создать его следующим образом:
df['Word'] = r'\b' + df[' Word'].astype(str) + r'\b'
df.groupby('Country').agg(",".join).reset_index()
group1 =df[df['Country']== 1]
list1.extend(group1['Word'])