Начало вашего регулярного выражения ^([a-z]+ |[,.!?] ?)
означает, что строка должна начинаться с любого количества букв, за которыми следует пробел, или ровно с одного знака пунктуации, за которым следует пробел.
То, что вы хотите, это соответствовать одномудо одного слова, за которым следуют символы пунктуации от нуля до одного, а затем пробелы от нуля до одного:
^([a-z]+[,.!?]? ?)?
~^([a-z]+[,.!?]? ?)?(who|whom|what|where|when|why|how|which)[s]?\b~i
Это будет соответствовать запятой и пробелу в первой группе и why
во второй группе, как это может бытьвидел неработающий на Regexer здесь и работает на 3v4l здесь .