String generator based on a wildcard Your task, if you accept it, is to make a string generator that generates strings based on a wildcard.

You can make a function or a full program that receives 1 argument and sends to the standard output/console a string that matches.

Wildcard characters and sequences:


* produces 0 or more random characters
? produces exactly 1 random character
[] detonates a group and produces any one of the characters from the group, exactly once.
[]* produces at least 0 of the characters from that group
[]? produces any one of the characters from that group, at most once
[]{n} produces n characters in that group
Anything else is a literal string


The supported characters to return are a-z, A-Z and 0-9.
Casing doesn't matter.

You can do whatever you want with invalid input.

Examples:

f('a[d-f]{3}') //return 'addd', 'adde', 'addf' ...

f('a*') //returns 'a' or anything starting with 'a'

f('[bt]est') //returns 'best', 'test'


Scoring:


Shortest code in bytes wins.
-10% bonus if you support symbols
-10% bonus if you implement multiple matches, inside each group (e.g.: [ae,c-d,0-5])
-20% bonus if you implement negated group (e.g.: [^a-f] returns anything that doesn't start with a-f)
-10% if you support at least 3 regex character classes (e.g.: \d,\s,\D)
Standard loopholes are not allowed!


Any doubts, feel free to ask in a comment.
Python 3, 511 bytes - 10% = 459.9
It's early morning over here so golfing mode hasn't quite kicked into my system yet, but it was a really fun-looking problem so I thought I'd try it anyway.

from random import*
C=0
r=input()
i=0
S=&quot;&quot;
Q=&quot;&quot;
while i&lt;len(r):
 c=r[i]
 if i&lt;len(r)-1:d=r[i+1]
 if&quot;]&quot;==c:
  C=0
  if d not in&quot;*?{&quot;:S+=choice(Q)
 elif&quot;[&quot;==c:C=1;Q=&quot;&quot;
 elif&quot;*&quot;==c:
  while random()&gt;.2:S+=choice(Q)
 elif&quot;?&quot;==c:S+=choice(Q)*randint(0,1)
 elif&quot;{&quot;==c:
  a=&quot;&quot;
  while r[i+1]!=&quot;}&quot;:a+=r[i+1];i+=1
  S+=&quot;&quot;.join(choice(Q)for _ in range(int(a)))
 elif&quot;}&quot;!=c:
  if&quot;-&quot;==d:Q+=&quot;&quot;.join(chr(x)for x in range(ord(c),ord(r[i+2])+1));i+=2
  else:
   Q=C*Q+c
   if not C and d not in&quot;*?{&quot;:S+=choice(Q)
 i+=1
print(S)

I'm claiming the &quot;multiple matches, inside each group&quot; bonus. You can try it out like so:
[abA-C0]*