Если после числа есть специальный символ, а после него нет ничего, специальный знак также учитывается.
токовый выход:
109* = 2
405,406+,407 = 4
20++1=3
ожидаемый выход:
109* = 1
405,406+,407 = 3
20++1=2
code1:
data['total_books']=data.books.str.count('[!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]').add(1)
code2:
data.books.str.split(r'[!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]').str.len()
оба кода дают одинаковый вывод.
любое возможное решение.