Well, it IS possible, but not that easy...
Code:
/*
remove all bans affecting a user or a mask on a certain chan or the active channel
syntax: /remban <nick|mask> [#channel]

method used: 
- nick entered: check for nick being in your ial, or try to get nick's address per /who. 
- mask entered: complete that mask
  (so it works with nick!ident@host but also for !ident or ident@host or @*.domain etc).
- remove on that chan all bans affecting that address/mask by looping the internal banlist.
*/

alias remban {
  var %echo = echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:)
  ; error checking feedback
  if (!$1) {
    %echo Syntax is /remban <nick or mask> [#channel]
    return
  }
  var %chan = $iif(($2),#$2,$active)
  if (%chan !ischan) { %echo No channel specified. Syntax: /remban <nick or mask> [#channel] }
  elseif ($me !ison %chan) { %echo You have to be on channel $qt(%chan) to remove bans. }
  elseif (($me !isop %chan) && ($me !ishop %chan)) {
    %echo You have to be opped on channel $qt(%chan) to remove any bans.
  }
  elseif (!$chan(%chan).ibl) {
    %echo Internal banlist of $qt(%chan) not up to date (retrieving the banlist now). $& 
      Try again in a second...
    .mode %chan +b
  }
  ; unban or get mask and unban (...further error checking)
  else {
    if ($ial($1)) { rb.unban $v1 %chan }
    elseif ($regex($1,/!|@/)) {
      var %mask = $rb.getmask($1)
      if ((%mask == error) || (!$regex(%mask,/^[-\]\\_\*^[{}|`\w]+![\w\*~-]+@[\w\.\*-]+$/)))  { 
        %echo $qt($1) cannot be a valid (partial) mask.
      }
    }
    elseif (!$regex($1,/^[-\]\\_^[{}|`\w]+$/)) { %echo $qt($1) cannot be a valid nickname. }
    else {
      set -e %remban.nick $1
      set -e %remban.chan %chan
      .enable #who.remban
      who $1
    }
  }
}

; return a 'wildcard fullmask' of a maybe partial mask input
; (this alias is pretty ugly but useful :X)
alias -l rb.getmask {
  var %m = $strip($1)
  ; invalid input
  if ($regex(%m,/!.*!|@.*@|!@|@.*!/)) { return error }
  if ($remove($gettok(%m,2,64),$chr(42),$chr(45),$chr(46))) {
    if ($v1 !isalnum) { return error }
  }
  if ($remove(%m,$chr(33),$chr(42),$chr(64)) == $null) { return *!*@* }
  ; input == nick
  if (!$regex(%m,/!|@/)) { return $+(%m,!*@*) }
  else {
    if ($regex(%m,/!/)) {
      ; input contains only !
      if (!$regex(%m,/@/)) { 
        if ($left(%m,1) == $chr(33)) { var %m = $+($chr(42),%m) }
        if ($right(%m,1) == $chr(33)) { var %m = $+(%m,$chr(42)) }
        return $+(%m,@*)
      }
      else { 
        ; input contains ! and @
        if ($istok(!•@,$left(%m,1),149)) { var %m = $+($chr(42),%m) }
        if ($right(%m,1) == $chr(64)) { var %m = $+(%m,$chr(42)) }
        return %m
      }
    }
    else {  
      ; input contains only @
      if ($left(%m,1) == $chr(64)) { var %m = $+($chr(42),%m) }
      if ($right(%m,1) == $chr(64)) { var %m = $+(%m,$chr(42)) }
      return $+(*!,%m)
    }
  }
}

; parsing who replies
#who.remban off
RAW 352:*: {
  if ($6 == %remban.nick) {
    rb.unban $+($6,!,$3,@,$4) %remban.chan
    set %remban.done 1
    haltdef 
  }
}

RAW 315:*: {
  if ($2 == %remban.nick) { 
    if (!%remban.done) {
      echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:) Did not find user $qt($2) on $network $+ . $&
        You might remove bans matching the nick $qt($2) with: /remban $rb.getmask($2) %remban.chan
    }
    unset %remban.*
    .disable #who.remban
    haltdef
  }
}
#who.remban end

; unban loop
alias -l rb.unban {
  var %nr = 1, %bans
  while ($ibl($2,%nr)) {
    if ($v1 iswm $1) {
      inc %bans 
      mode $2 -b $v1
    }
    inc %nr
  }
  if (%bans) { echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:) removing %bans ban(s) matching $qt($1) on channel $2 $+ . }
  else { echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:) Found no bans matching $qt($1) on channel $2 $+ . }
}

...as you see. Thus, no good thing to start out scripting smile