s/(\p{Alnum})\P{Alnum}(\p{Alnum})/${1}_${2}/g;
Конечно, это повредит вашим изменениям с "# A # B% C", поэтому вы можете использовать осмотры:
s/(?<=\p{Alnum})\P{Alnum}(?=\p{Alnum})/_/g;
Таким образом, вы изолируете его только от символа "alnum".
Или вы также можете использовать «флаг сохранения» и сделать то же самое.
s/\p{Alnum}\K\P{Alnum}(?=\p{Alnum})/_/g;
РЕДАКТИРОВАТЬ на основе ввода:
Чтобы не есть символ новой строки, вы можете сделать следующее:
s/\p{Alnum}\K[^\p{Alnum}\n](?=\p{Alnum})/_/g;