This regex should do what you need:
/^([#~.>+](?=[a-z]+$)|[*](?=$))([a-z]*)$/
See it on regex101.com
Explanation:
^ # Start of string
( # Match and capture in group number 1:
[#~.>+] # Either: one "special character"
(?= # but only if it's followed by
[a-z]+ # at least one lowercase ASCII letter
$ # and the end of the string.
) # End of lookahead
| # OR
[*] # one (different) special character
(?=$) # but only if the string ends right after it.
) # End of the first capturing group
( # Match and capture in group number 2:
[a-z]* # Zero or more ASCII lowercase letters
) # End of the second capturing group
$ # End of string