Ну вот, накарябал первое что пришло в голову.
(^|\A|\s|\-)[Сс]лов.*?(\s|$|\Z|\-)
Предположим нам нужно найти слово слово.
Корень - слов.
Перед словом может быть: начало строки, начало текста, пробел или дефис.
Может начинаться как с маленькой так и с большой буквы.
После слова может быть - пробел, конец строки, конец текста, дефис.
Правда регулярка возвращает слово с различными окончаниями + знак препинания. который может идти сразу после слова (дефис, запятая, точка, двоеточие и прочие). Знак препинания можно вырезать уже другой регуляркой с помощью preg_replace ;)
UPD. Также, увы, будет цеплять однокренные слова и просто начинающиеся аналогично. То есть в данном случае словосочетание, словил, словно и т.п. Наверное, в регулярке придётся перечислить все возможные окончания:
(^|\A|\s|\-)[Сс]лов(о|а|ом|у|ам|ами|е)?[^а-яА-Я]*?(\s|$|\Z|\-)
То есть после корня перечисляем ВСЕ возможные окончания для данного слова, затем могут быть знаки препинания (в данном случае субпаттерн - не русские буквы). Знаки препинания и пробел в конце вырезать дополнительно из результатов поиска по этой регулярке.
Регулярка сырая, вроде работает, но подробно не тестировал. Думаю, общее направление Вам понятно :)