Just a thought - can you use a regex to remove duplicated characters as a first pass and then check for whatever words you want in a dictionary-like search? I can see that there will be many root words that you will need to test for and there are a multitude of prefixes and suffixes that could be applied - hence the use of dictionary-search techniques.
When I am faced with issues about how to achieve some outcome, I sit down and determine how I would do it mechanically. Generally this leads me to creating a state transition diagram which then allows me to create a regex pattern. In this case, where you want to ban certain obscenities but leave other (similar) words alone, you need to work out exactly how you can differentiate between then. Perhaps using the '\b' anchor to try to match the beginning of a word (you may need a more rigourous test) would stop the classic of "Scunthorpe" being caught as an obscenity.
If you do use regex, then you might be able to factor some of your expressions a bit. For example
(u+c+k+|u+k+)
is the same as
u+(c+)?k+
which is also the same as
u+c*k+
Similarly, a lot of your suffixes are the same as others but with "s" on the end. Therefore something like
s|er|ed|ers
would be (almost) the same as
(e(r|d))?s?
Susan