Context: I created a "\citep-like" macro. I use it in the body of my document to refer to some code found in appendix.
My macro takes a comma-separated list as input, and prints each element of the list as an hyperref link to the relevant part of the code. (To make things easy, the text of the hyperref link is the key itself, and the syntax of link's anchor is code:<key>.)
\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{lipsum}
\newcommand{\codecitep}[1]{% cf. https://tex.stackexchange.com/a/87423/64454
[%
\def\nextitem{\def\nextitem{, }}% Separator
\renewcommand*{\do}[1]{\nextitem{\hyperref[code:##1]{##1}}}% How to process each item
\docsvlist{#1}% Process list
]%
}
\begin{document}
\section{Body}
A sentence with one code-citation only \codecitep{key1}.
Another sentence with two code-citations and followed by dummy text \codecitep{key1, key2}.
% A sentence with one code-citation only \codecitep{a_123}.
% Another sentence with two code-citations and followed by dummy text \codecitep{a_123, bb_456}.
\lipsum[1-2]
\section{Appendix}
\lipsum[3]
\subsection{key1}
\label{code:key1}
\label{code:a_123}
\lipsum[4]
\subsection{key2}
\label{code:key2}
\label{code:bb_456}
\lipsum[5]
\end{document}
Problem:
The MWE above works great. However, my real-case keys have following structure: a_123, bb_456, etc. (I.e. there is an underscore in the middle of the key, and the number of letters before it is unknown.)
Of course this makes compilation fail since the underscore is neither escaped nor in a math environment.
Question: How to handle keys with underscore in my comma-separated list of argument of my macro?

