As Sergei has asked, the key to this is probably the regex variant that you are using.
I must admit that I'm not familiar with any regex variant that would accept the '{\D}*' part of your pattern except perhaps to treat the '{' and '}' as literal characters and thos would make your pattern not match any of your examples.
IF your regex variant understands negative lookbehinds, then
(?<!\d)%
would be a simplistic pattern that would do as you ask. However I suspect from your pattern that there are other criteria that are involved with the match (otherwise why would you have the '\b' and '\W' parts that do not get mentioned in the "% but not preceded by a digit" (my paraphrase of your question) statement of your issue.
By the way, my pattern above does work in the "split" operation within my regex tester as well but will leave the leading and trailing whitespace etc that you may be trying to get rid of as well. Just guessing....
Susan